2016-12-16 57 views
-5

是否可以寫一個通用的C#方法,將是這樣的:泛型類型,其中T可以是任何

MyClass.Function1<string>() 
MyClass.Function1<IEnumerable<string>>() 
MyClass.Function1<IDictionary<string, string>>() 
MyClass.Function1<IDictionary<string, IEnumerable<string>>>() 

T可以是任何東西

T = string 
T = IEnumerable<string> 
T = IDictionary<string, string> 
T = IDictionary<string, IEnumerable<string>> 

第二個問題

我可以創建一個靜態方法將不依賴於類型嗎?

string GetSth().Function1(); 
IEnumerable<string> GetSth().Function1() 
IDictionary<string, string> GetSth().Function1() 
IDictionary<string, IEnumerable<string>> GetSth().Function1() 
+1

'Function1'與類型參數有什麼關係? – Lee

+1

聽起來像你需要閱讀關於泛型的介紹教程,並在遇到試圖實現你的方法的更具體問題後提出問題。是的,它可能會讓你做這兩件事,但這取決於你想要做什麼,以及該方法實際需要做什麼。 – Servy

+1

每個問題詢問**一個**問題,而不是兩個。 – Amy

回答

1

對於第一個問題定義與在哪裏共享接口如IEnumerable的或沒有任何一個通用類where子句:

public class MyClass 
{ 
    public static string Function1<T>() 
    { 
     return typeof(T).FullName; 
    } 
    public static string Function2<T>() where T : IEnumerable 
    { 
     return typeof(T).FullName; 
    } 
} 

和用於第二個限定Extension Methods

public static class MyClass_Extensions 
{ 
    public static string StaticMethod1(this object obj) 
    { 
     return obj?.ToString(); 
    } 

    public static string StaticMethod2(this IEnumerable obj) 
    { 
     return obj?.ToString(); 
    } 
} 

所以我們可以寫這個測試方法:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(MyClass.Function1<string>()); 
     Console.WriteLine(MyClass.Function1<IEnumerable<string>>()); 
     Console.WriteLine(MyClass.Function1<IDictionary<string, string>>()); 
     Console.WriteLine(MyClass.Function1<IDictionary<string, IEnumerable<string>>>()); 

     Console.WriteLine(MyClass.Function2<string>()); 
     Console.WriteLine(MyClass.Function2<IEnumerable<string>>()); 
     Console.WriteLine(MyClass.Function2<IDictionary<string, string>>()); 
     Console.WriteLine(MyClass.Function2<IDictionary<string, IEnumerable<string>>>()); 

     // Static Method: 
     var strObj = "string"; 
     Console.WriteLine(strObj.StaticMethod1()); 
     Console.WriteLine(strObj.StaticMethod2()); 

     IEnumerable<string> listObj = new List<string>(); 
     Console.WriteLine(listObj.StaticMethod1()); 
     Console.WriteLine(listObj.StaticMethod2()); 

     IDictionary<string, string> dicObj = new Dictionary<string, string>(); 
     Console.WriteLine(dicObj.StaticMethod1()); 
     Console.WriteLine(dicObj.StaticMethod2()); 

     IDictionary<string, IEnumerable<string>> dicLisObj = new Dictionary<string, IEnumerable<string>>(); 
     Console.WriteLine(dicLisObj.StaticMethod1()); 
     Console.WriteLine(dicLisObj.StaticMethod2()); 
    } 
} 
相關問題