在紅寶石和其他一些方面,它可能會添加一個新的方法到先前存在的祖先類,所有的後代繼承它們。我想知道在C#中這是否可行。C#是否有可能將方法添加到超類
例如,我想向Xamarin.Forms中的Page類添加一些方法,這些方法將使它們在Page的所有NavigationPages ContentPages和其他後代中自動可用。你能用C#做那種事嗎?
在紅寶石和其他一些方面,它可能會添加一個新的方法到先前存在的祖先類,所有的後代繼承它們。我想知道在C#中這是否可行。C#是否有可能將方法添加到超類
例如,我想向Xamarin.Forms中的Page類添加一些方法,這些方法將使它們在Page的所有NavigationPages ContentPages和其他後代中自動可用。你能用C#做那種事嗎?
是,排序的,通過使用 「擴展方法」:
void Main()
{
var foo = new Foo();
Console.WriteLine(foo.GetDoubleBar());
}
public class Foo
{
public int Bar => 42;
}
// Defined somewhere else in your code
public static class FooEx
{
public static int GetDoubleBar(this Foo foo) => foo.Bar * 2;
}
的this
關鍵字在static
GetDoubleBar
在static
類FooEx
定義的擴展方法。
當運行此輸出84
。
是的確的擴展方法是C#中的方法,因爲它們擴展了類型元數據以包含方法。最好的例子是Linq to objects
,其所有方法的擴展名爲IEnumerable<T>
,因此讓所有子集合類都使用相同的方法進行類似的處理。標準格式是靜態類中的靜態方法,第一個對象標記爲this
關鍵字,它告訴編譯器這是一個擴展方法,以下面的例子,它擴展了字符串類Contains
方法來忽略大小寫。
public static class StringExtensions
{
public static bool Contains(this string source, string subString)
{
return source?.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0;
}
}
雖然string
不能是一個基類的任何其他類型,但上面的例子表明,我們可以做到這一點對.NET Framework中所有種類型。
以下是對LINQ Select
代碼,查here瞭解更多詳情:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector) {
if (source == null) throw Error.ArgumentNull("source");
if (selector == null) throw Error.ArgumentNull("selector");
return SelectIterator<TSource, TResult>(source, selector);
}
是,排序的,通過使用 「擴展方法」。 – Enigmativity
感謝Enigmativity,幫助。似乎它會做到這一點,儘管必須在每個我想要利用擴展方法的模塊中放入「using」子句稍微乏味。 – user1023110
@ user1023110 - 不必爲需要引用的任何類放置'using'子句。 – Enigmativity