调用类型参数的方法

时间:2010-07-29 08:33:16

标签: c# generics type-parameter

有没有办法做这样的代码:

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

或者,如何调用类型参数的函数(类型是我的自定义类)。

4 个答案:

答案 0 :(得分:6)

回复:

  

T.A();

如果这是你的意思,你不能调用type-parameter的静态方法。最好将其重构为T的实例方法,可能使用通用约束(where T : SomeTypeOrInterfaceSomeTypeOrInterface定义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