如何为Types创建扩展方法

时间:2009-12-04 17:18:51

标签: c# extension-methods

我正在编写一个扩展方法来解析任何给定类型的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);

由于

4 个答案:

答案 0 :(得分:19)

简短的回答是无法做到;扩展方法需要处理某个实例。

答案 1 :(得分:3)

要使用扩展方法,您必须执行以下操作:

var instance = typeof(MyClass).ParseJson(text);

令牌“MyClass”不是Type instamce intself,但使用typeof将为您提供一个Type来操作。但这怎么会比这更好:

var instance = JsonUtility.ParseJson<MyClass>(text);

编辑:实际上,扩展方法的代码仍然不能做你想要的。它将始终返回“Type”对象,而不是该T​​ype的实例。

答案 2 :(得分:2)

您无法创建适用于该类型本身的扩展方法。它们只能在类型的实例上调用。

答案 3 :(得分:0)

如接受的答案所述,您不能。但是,前提是您具有可以从T:的实例调用的扩展方法:

public static T ParseJson<T>(string s)
    where T: new()
    => new(T).ParseJson(s);

您可以编写这样的实用方法:

var t = Utilities.ParseJson<T>(s);

并这样称呼它:

URL

恐怕这是您可以做的最好的事情...