[英]How to create extension methods for Types
我正在编写一个扩展方法来解析任何给定类型的 JSON 字符串。 我想在类型上使用该方法,而不是像我们已经知道的许多示例那样使用实例,但我觉得 Visual Studio 不支持它。 有人可以在这里启发我吗? 以下是方法:
public static T ParseJson<T>(this T t, string str) where T: Type
{
if (string.IsNullOrEmpty(str)) return null;
var serializer = new JavaScriptSerializer();
var obj = serializer.Deserialize<T>(str);
return obj;
}
我想以这种方式调用该方法:
var instance = MyClass.ParseJson(text);
谢谢
简短的回答是无法做到。 扩展方法需要在某事的实例上工作。
要使用扩展方法,您必须执行以下操作:
var instance = typeof(MyClass).ParseJson(text);
标记“MyClass”不是类型 instamce intself,但使用 typeof 会给你一个类型来操作。 但这有什么比:
var instance = JsonUtility.ParseJson<MyClass>(text);
编辑:实际上,扩展方法的代码仍然不会做你想要的。 它总是会返回一个“类型”对象,而不是该类型的实例。
您不能创建适用于类型本身的扩展方法。 它们只能在类型的实例上调用。
正如接受的答案中所述,您不能。 但是,如果您有一个可以从 T 实例调用的扩展方法:
public static T ParseJson<T>(this T t, string s)
你可以写一个这样的实用方法:
public static T ParseJson<T>(string s)
where T: new()
=> new(T).ParseJson(s);
并这样称呼它:
var t = Utilities.ParseJson<T>(s);
恐怕这是你能做的最好的...
您可以创建和扩展方法
public static class MyExtensions
{
public static string Serialize<T>(this T self)
{
return JsonSerializer.Serialize(self);
}
}
并像使用它一样
instance.Serialize();
您不必像instance.Serialize<Type>();
那样使用它因为大多数时候(如果不是所有时间)它可以从使用中推断出来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.