Как создать методы расширения для типов

Я пишу метод расширения для разбора строки 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);

Спасибо

Ответы

Ответ 1

Короткий ответ: это невозможно сделать; методы расширения должны работать над экземпляром чего-то.

Ответ 2

Чтобы использовать метод расширения, вам нужно будет:

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

Токен "MyClass" не является встроенным устройством типа, но с помощью typeof вы получите тип, который будет работать. Но как это лучше, чем:

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

Изменить: На самом деле код метода расширения по-прежнему не будет делать то, что вы хотели. Он всегда будет возвращать объект "Тип", а не экземпляр этого типа.

Ответ 3

Вы не можете создавать методы расширения, которые применяются к самому типу. Их можно вызывать только для экземпляров типа.

Ответ 4

Как указано в принятом ответе, вы не можете. Однако при условии, что у вас есть метод расширения, который можно вызвать из экземпляра 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);

Я боюсь, что лучшее, что ты можешь сделать...