C# 是否允许在另一个泛型方法中调用泛型方法?

C# 是否允许在另一个泛型方法中调用泛型方法?,c#,generics,unity3d,refactoring,C#,Generics,Unity3d,Refactoring,我正在和Unity做一个RTS游戏。在我的游戏中有很多类型的资源,比如,树,农场。每个资源都是一个游戏对象,有自己的主脚本控制它 我想收获一棵树,我称之为 gameObject.GetComponent<Tree>().Harvest(); gameObject.GetComponent().Harvest(); 如果我想收获农场,我调用相同的脚本,但将“Tree”更改为“farm”,这很好,但代码将重复。所以我用泛型方法来抽象它,就像这样 void Harvest<T&g

我正在和Unity做一个RTS游戏。在我的游戏中有很多类型的资源,比如,树,农场。每个资源都是一个游戏对象,有自己的主脚本控制它

我想收获一棵树,我称之为

gameObject.GetComponent<Tree>().Harvest();
gameObject.GetComponent().Harvest();
如果我想收获农场,我调用相同的脚本,但将“Tree”更改为“farm”,这很好,但代码将重复。所以我用泛型方法来抽象它,就像这样

void Harvest<T>(){
    gameObject.GetComponent<T>().Harvest();
}
void-Harvest(){
gameObject.GetComponent().Harvest();
}
但是C#编译器不让我这么做。我想知道有没有可能定义泛型方法,在里面使用泛型方法?如果没有,有没有办法像这样抽象我的代码?多谢各位

错误消息:

“T”不包含“Harvest”的定义,并且找不到接受类型为“T”的第一个参数的扩展方法“Harvest”(是否缺少using指令或程序集引用?[assembly CSharp]


问题是在

void Harvest<T>(){
    gameObject.GetComponent<T>().Harvest();
}
使用以下命令指定约束:

void Harvest<T>() where T : IHarvestable 
{
    gameObject.GetComponent<T>().Harvest();
}
void Harvest(),其中T:IHarvestable
{
gameObject.GetComponent().Harvest();
}


在控制基类的其他情况下,也可以在基类中声明所需的方法(可能是抽象的),并在中指定基类而不是接口。

为使用
Harvest()
的所有对象定义一个接口,然后定义T扩展该接口:

public interface IHarvestable
{
    void Harvest();
}

// In your class:
void Harvest<T>() where T: IHarvestable
{
    gameObject.GetComponent<T>().Harvest();
}

注意,这是一种不好的做法,导致在运行时解析方法调用,导致性能缺陷,并使代码更容易出错。例如,编译器将允许使用未实现
Harvest()
T
类型实例中的方法,从而导致运行时错误。

“不允许我这样做”,您确定它不会给您更多。。。具体的错误消息?例如,
GetComponent
是否有约束?此外,所有类型是否都有
.Harvest
方法?这是一种扩展方法吗?否则,您将不得不自己添加一个约束,比如只允许实现提供
Harvest
方法的接口的T,比如
void Harvest(),其中T:IHarvestable{…
添加了错误消息。@LasseVågsætherKarlsen。我将尝试使用接口。@LasseVågsætherKarlsen使用动态方式看起来很有趣。您能演示示例吗?建议您使用接口方式。
public interface IHarvestable
{
    void Harvest();
}

// In your class:
void Harvest<T>() where T: IHarvestable
{
    gameObject.GetComponent<T>().Harvest();
}
dynamic harvestable = gameObject.GetComponent<T>();
harvestable.Harvest();