[英]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.