有没有办法做这样的代码:
class GenericClass<T>
{
void functionA()
{
T.A();
}
}
或者,如何调用类型参数的函数(类型是我的自定义类)。
答案 0 :(得分:6)
回复:
T.A();
如果这是你的意思,你不能调用type-parameter的静态方法。最好将其重构为T
的实例方法,可能使用通用约束(where T : SomeTypeOrInterface
,SomeTypeOrInterface
定义A()
)。另一种选择是dynamic
,它允许对实例方法进行鸭子输入(通过签名)。
如果您的意思是T
仅在运行时知道(作为Type
),那么您需要:
typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...);
答案 1 :(得分:2)
我认为您正在寻找generic type constraints:
class GenericClass<T> where T : MyBaseClass
{
void functionA<T>(T something)
{
something.A();
}
}
就您发布的代码而言 - 为了在T
上调用某些内容,您需要将其作为参数传递给functionA
。您使用的约束必须确保任何T
都有A
方法可以使用。
答案 2 :(得分: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");
}
}
答案 3 :(得分:1)
我从你的代码中了解到你想调用一个类型参数静态方法,这是不可能的。
有关详细信息,请参阅此处:Calling a static method on a generic type parameter