2010-07-29 122 views
5

有沒有辦法做到代碼,這一點:呼叫類型參數的方法

class GenericClass<T> 
{ 
    void functionA() 
    { 
     T.A(); 
    } 
} 

或者說,如何調用類型參數的函數(類型是我的一些自定義類)。

回答

2

要調用你必須首先實例化該泛型類型對象的方法。

public static void RunSnippet() 
{ 
    var c = new GenericClass<SomeType>(); 
} 

public class GenericClass<T> where T : SomeType, new() 
{ 
    public GenericClass(){ 
     (new T()).functionA(); 
    } 
} 

public class SomeType 
{ 
    public void functionA() 
    { 
     //do something here 
     Console.WriteLine("I wrote this"); 
    } 
} 
+0

是否有可能使用公共類GenericClass 其中T:SomeType1,SomeType2,新的() – Dusan 2010-07-29 10:35:40

+0

不,你只能指定一個基類(你可以創建一個SomeTypeBase,指定此作爲類型約束,讓SomeType1和SomeType3從這個繼承SomeTypeBase類)。 – Peter 2010-07-29 13:52:30

2

我認爲你正在尋找generic type constraints

class GenericClass<T> where T : MyBaseClass 
{ 
    void functionA<T>(T something) 
    { 
     something.A(); 
    } 
} 

在您發佈的代碼的條款 - 爲了呼籲T的東西,你需要把它作爲參數傳遞給functionA。您使用的約束必須確保任何T都有可以使用的A方法。

+0

不,我有這樣的錯誤: 「T」是一個「類型參數」,這是不是在給定的情況下 – Dusan 2010-07-29 08:41:27

+0

@shandu有效 - 答案更新。您還需要提供通用參數。 – Oded 2010-07-29 08:52:27

+0

是否有可能使用:類GenericClass 其中T:MyBaseClass1,MyBaseClass2 – Dusan 2010-07-29 10:36:14

6

回覆:

T.A();

您不能調用類型參數的靜態方法,如果這是你的意思。你可能會更好地重構一個實例方法T,可能帶有一個通用約束(where T : SomeTypeOrInterface,其中SomeTypeOrInterface定義爲A())。另一種選擇是dynamic,這允許實例方法(通過簽名)的鴨打字。

如果你的意思是,T在運行時只知道(作爲Type),那麼你將需要:

typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...);