2017-08-03 85 views
0

在紅寶石和其他一些方面,它可能會添加一個新的方法到先前存在的祖先類,所有的後代繼承它們。我想知道在C#中這是否可行。C#是否有可能將方法添加到超類

例如,我想向Xamarin.Forms中的Page類添加一些方法,這些方法將使它們在Page的所有NavigationPages ContentPages和其他後代中自動可用。你能用C#做那種事嗎?

+2

是,排序的,通過使用 「擴展方法」。 – Enigmativity

+0

感謝Enigmativity,幫助。似乎它會做到這一點,儘管必須在每個我想要利用擴展方法的模塊中放入「using」子句稍微乏味。 – user1023110

+0

@ user1023110 - 不必爲需要引用的任何類放置'using'子句。 – Enigmativity

回答

5

是,排序的,通過使用 「擴展方法」:

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關鍵字在staticGetDoubleBarstaticFooEx定義的擴展方法。

當運行此輸出84

0

是的確的擴展方法是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); 
     } 
相關問題