[英]How do I add .Net C# class extension of System.Array
我對 class 擴展非常熟悉,但沒想到會出現以下行為。
我希望以下內容能夠擴展 System.Array,但事實並非如此。 相反,它擴展了 System.Array 的實例。 為什么?
public static T[] Concatenate<T>(this Array value1, Array value2)
{
int l1 = value1 == null ? 0 : value1.Length;
int l2 = value2 == null ? 0 : value2.Length;
T[] result = new T[l1 + l2];
if (l1 > 0)
{
Array.Copy(value1, 0, result, 0, l1);
}
if (l2 > 0)
{
Array.Copy(value2, 0, result, l1, l2);
}
return result;
}
...
大批。 // 沒有連接
string[] s = new string[1];
s.Concatenate<string>... // appears here
因為您只能為類型的實例定義擴展方法。 要調用它們,您可以使用類似語法的實例方法調用
var result = s.Concatenate(t);
或標准的靜態方法調用語法
var result = ArrayExtensions.Concatenate(s, t);
同樣,您不能將方法添加到Array
,只能添加到Array
的實例(實際上,您並沒有添加方法,它只是一個編譯器技巧,使它看起來像您所做的那樣)。
順便說一句,我只想把你的方法寫成
return value1.Concat(value2).ToArray();
我希望以下內容能夠擴展 System.Array,但事實並非如此。 相反,它擴展了 System.Array 的實例。 為什么?
因為沒有辦法定義 static 擴展方法 - 只能定義實例擴展方法(來自 MSDN :):
擴展方法是一種特殊的 static 方法,但它們被稱為擴展類型上的實例方法。
但是,您可以以 static 方式調用您的擴展方法,但使用您的 class 擴展名:
MyExtensions.Concatenate(s, f);
這是定義方法的 Pythonic 方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.