有沒有辦法做到代碼,這一點:呼叫類型參數的方法
class GenericClass<T>
{
void functionA()
{
T.A();
}
}
或者說,如何調用類型參數的函數(類型是我的一些自定義類)。
有沒有辦法做到代碼,這一點:呼叫類型參數的方法
class GenericClass<T>
{
void functionA()
{
T.A();
}
}
或者說,如何調用類型參數的函數(類型是我的一些自定義類)。
要調用你必須首先實例化該泛型類型對象的方法。
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");
}
}
我認爲你正在尋找generic type constraints:
class GenericClass<T> where T : MyBaseClass
{
void functionA<T>(T something)
{
something.A();
}
}
在您發佈的代碼的條款 - 爲了呼籲T
的東西,你需要把它作爲參數傳遞給functionA
。您使用的約束必須確保任何T
都有可以使用的A
方法。
回覆:
T.A();
您不能調用類型參數的靜態方法,如果這是你的意思。你可能會更好地重構一個實例方法T
,可能帶有一個通用約束(where T : SomeTypeOrInterface
,其中SomeTypeOrInterface
定義爲A()
)。另一種選擇是dynamic
,這允許實例方法(通過簽名)的鴨打字。
如果你的意思是,T
在運行時只知道(作爲Type
),那麼你將需要:
typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...);
我從你的代碼明白,你要調用一個類型參數靜態方法,和這是不可能的。
這裏看到更多的信息:Calling a static method on a generic type parameter
是否有可能使用公共類GenericClass其中T:SomeType1,SomeType2,新的() –
Dusan
2010-07-29 10:35:40
不,你只能指定一個基類(你可以創建一個SomeTypeBase,指定此作爲類型約束,讓SomeType1和SomeType3從這個繼承SomeTypeBase類)。 – Peter 2010-07-29 13:52:30