繁体   English   中英

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

[英]How to implement generic method in c#

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

错误1'T'不包含'GetDetails'的定义,并且找不到扩展方法'GetDetails'接受类型为'T'的第一个参数(是否缺少using指令或程序集引用)

我在哪里弄错了?

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

由于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();
            }

您的方法是通用的,因此编译器不知道(在编译时)哪种特定类型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继承的类型MammalBase可以用作通用参数。 因此,编译器知道mammal实现了GetDetails()方法。


请注意 ,您的代码中没有使用ref关键字,并且您实际上不需要显示的代码泛型,因为您只需将参数类型MammalBase (但也许您只是显示了一个简短的示例,并且需要ref和泛型用于您的实际应用)。

如果您打算使用一组可能的类型,则还可以尝试强制转换通用类型并检查其是否有效。

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();
    }
}

如果您将其投放,intellisense会告诉您可以访问哪些属性和功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM