加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:41:48 所属栏目:百科 来源:网络整理
导读:我正在与Unity进行RTS游戏.我的游戏中有很多类型的资源,例如树,农场.每个资源都是一个GameObject,并拥有自己的主脚本来控制它. 防爆.我想要收获一棵树,我称之为. gameObject.GetComponentTree().Harvest(); 如果我想收获农场,我会调用相同的脚本,但将“Tree
我正在与Unity进行RTS游戏.我的游戏中有很多类型的资源,例如树,农场.每个资源都是一个GameObject,并拥有自己的主脚本来控制它.

防爆.我想要收获一棵树,我称之为.

gameObject.GetComponent<Tree>().Harvest();

如果我想收获农场,我会调用相同的脚本,但将“Tree”更改为“Farm”,这很好,但代码将被复制.所以我通过使用这样的泛型方法来抽象它.

void Harvest<T>(){
    gameObject.GetComponent<T>().Harvest();
}

但是C#编译器不允许我这样做.我想知道是否可以定义使用泛型方法的泛型方法?如果没有,有没有办法像这样抽象我的代码?谢谢.

错误信息:

‘T’ does not contain a definition for ‘Harvest’ and no extension method ‘Harvest’ accepting a first argument of type ‘T’ could be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]

解决方法

问题在于……

void Harvest<T>(){
    gameObject.GetComponent<T>().Harvest();
}

… C#编译器不知道T将是哪种具体类型.因此,它不知道会有一个Harvest可用的方法,也不知道它的确切声明(它是否返回void或bool或其他东西?它是否有可选参数?).因为C#是一种强类型语言,所以必须在编译时知道它.这使您确信一切都会在运行时顺利进行.

解决方案是通过指定泛型类型约束为编译器提供提示.为此,您必须声明一个接口,并让具有Harvest方法的组件实现它.

public interface IHarvestable
{
    void Harvest();
}

用以下内容指定约束:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读