[英]How to create extension methods for Types
我正在編寫一個擴展方法來解析任何給定類型的 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”不是類型 instamce intself,但使用 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);
恐怕這是你能做的最好的...
您可以創建和擴展方法
public static class MyExtensions
{
public static string Serialize<T>(this T self)
{
return JsonSerializer.Serialize(self);
}
}
並像使用它一樣
instance.Serialize();
您不必像instance.Serialize<Type>();
那樣使用它因為大多數時候(如果不是所有時間)它可以從使用中推斷出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.