24

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

2
  • Note that ParseJson returns a Type not a MyClass with this definition. Commented Dec 4, 2009 at 17:24
  • Thanks for the catch. I actually tried var instance = typeof(MyClass).ParseJson(text); not working Commented Dec 4, 2009 at 18:04

5 Answers 5

28

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

Sign up to request clarification or add additional context in comments.

Comments

9

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.

Comments

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...

Comments

2

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

1 Comment

and null instances of that type which is one of the redeeming values of ext. methods :) string val = null; val.IsNullOrEmpty() Sweet...
-1

You can create and extension method

public static class MyExtensions
{
    public static string Serialize<T>(this T self)
    {
        return JsonSerializer.Serialize(self);
    }
}

And use it like

instance.Serialize();

You don't have to use it like instance.Serialize<Type>(); because most of the time (if not all the time) it can be inferred from the usage.

1 Comment

do you realize the op has an extension method but he wants to instantiate an object from an extension method on the type not on the instance.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.