2010-07-29 121 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(...);