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