如何在c#中实现泛型方法

时间:2016-06-14 08:16:26

标签: c#

请帮助我实现通用方法。我收到了这条消息:

  

错误1'T'不包含'GetDetails'的定义,并且没有扩展方法'GetDetails'接受类型'T'的第一个参数(你是否缺少using指令或汇编引用)

我在哪里弄错了?

public static void displayAnimal<T>(ref T mammal)
{
    T ourMammal;
    ourMammal =  mammal;
    mammal.GetDetails();
}

3 个答案:

答案 0 :(得分:4)

由于T可以是任何类型,并且编译器不知道此方法将获得什么类型,因此可以仅使用通用对象方法。如果需要使用某个类或接口的方法,则应指定“where”(泛型类型约束)

  interface IAnimal // or class 
        {
         /*return type*/ GetDetails();
        }

        public static void displayAnimal<T>(ref T mammal) where T :IAnimal
            {
                T ourMammal;
                ourMammal =  mammal;
                mammal.GetDetails();
            }

答案 1 :(得分:2)

您的方法是通用的,因此编译器不知道(在编译时)特定类型T将是什么。想象一下,我会把这种方法称为

int noGetDetails = 12;
displayAnimal(ref noGetDetails);

int没有GetDetails()实施。

因此,编译器无法确定mammal.GetDetails()可能是什么,因为没有为mammal定义类型。

您可以添加通用约束来强制T作为实现GetDetails()方法的类型:

public class MammalBase
{
    public void GetDetails() { return... }
}

public class YourClass
{
    public static void displayAnimal<T>(ref T mammal) where T : MammalBase // this is the constraint
    {
        mammal.GetDetails();
    }
}

约束where T : MammalBase告诉编译器只有从MammalBase继承的类型才能用作泛型参数。因此编译器知道mammal实现了GetDetails()方法。

注意您的代码中的ref关键字没有用处,并且您实际上不需要为显示的代码提供泛型,因为您只需创建参数键入MammalBase(但您可能只是展示了一个缩短的示例,并且需要ref和泛型用于您的实际应用程序。)

答案 2 :(得分:0)

如果您打算使用一组可能的类型,也可以尝试转换泛型类型并检查它是否有效。

public static void displayAnimal<T>(T mammal)
{
    TargetType targetMammal = T as TargetType;

    if(targetMammal != null)
    {
        // the target type should have the function .GetDetails();
        targetMammal.GetDetails();
    }
}

如果你施放它,智能感知会告诉你可以访问哪些属性和功能。