有没有办法做到代码,这一点:呼叫类型参数的方法
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