请帮助我实现通用方法。我收到了这条消息:
错误1'T'不包含'GetDetails'的定义,并且没有扩展方法'GetDetails'接受类型'T'的第一个参数(你是否缺少using指令或汇编引用)
我在哪里弄错了?
public static void displayAnimal<T>(ref T mammal)
{
T ourMammal;
ourMammal = mammal;
mammal.GetDetails();
}
答案 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();
}
}
如果你施放它,智能感知会告诉你可以访问哪些属性和功能。