簡體   English   中英

如何為類型創建擴展方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM