How to create extension methods for Types

不羁岁月 提交于 2019-11-28 07:01:44

问题


I am writing an extension method for parsing JSON string for any given type. I wanted to use the method on types instead of instances like many examples we already know, but I somewhat feel it is not supported by Visual Studio. Can someone enlighten me here? The following is the method:

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;
}

I want to call the method in this fashion:

var instance = MyClass.ParseJson(text);

Thanks


回答1:


The short answer is it cannot be done; extension methods need to work on an instance of something.




回答2:


To use the extension method, you would have to do:

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

The token "MyClass" is not a Type instamce intself, but using typeof will get you a Type to operate on. But how is this any better than:

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

Edit: Actually, the code for the extension method still would not do what you wanted. It will always return a "Type" object, not an instance of that Type.




回答3:


You can't create extension methods that apply to the type itself. They can only be called on instances of a type.




回答4:


As stated in the accepted answer, you can't. However, provided that you have an extension method that can be called from an instance of T:

public static T ParseJson<T>(this T t, string s)

You could write a utility method like this:

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

And call it like this:

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

I am afraid that's the best you can do...



来源:https://stackoverflow.com/questions/1848411/how-to-create-extension-methods-for-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!