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

c# – 在运行时添加通用约束?

发布时间:2020-12-15 06:22:09 所属栏目:百科 来源:网络整理
导读:如果有任何想法,我很喜欢这样做.我有通用的方法 public void FooTClass(TClass item) where TClass : class{ } 而且我想从另一个泛型方法中调用这个方法,但是这个泛型方法没有类型约束“其中TClass:class” public void BarT(T item){ this.FooT(item);} 这
如果有任何想法,我很喜欢这样做.我有通用的方法
public void Foo<TClass>(TClass item) where TClass : class
{ }

而且我想从另一个泛型方法中调用这个方法,但是这个泛型方法没有类型约束“其中TClass:class”

public void Bar<T>(T item)
{
    this.Foo<T>(item);
}

这不行,我得到错误

“类型”T“必须是引用类型才能使用它作为参数”TClass“”

我明白了但是我的问题是这个 – 我可以用C#语法做什么,以便“过滤”通用类型“T”,如果它是一个类,将其传递给“this.Bar”.就像是….

public void Bar<T>(T item)
{
    if (typeof(T).IsClass)
        this.Foo<T **as class**>();
}

我意识到我可以使用反射来呼叫Foo,但这似乎就像作弊.有没有什么我可以用C#在运行时通过“T”的约束?

另外 – 我不能改变方法“Bar”的约束,因为它来自一个接口,所以约束必须匹配接口上的约束

解决方法

调用Foo没有反射的唯一方法是将项目转换为其层次结构中的一个类型/类(在正确的IsClass检查之后).

显然,在层次结构中只有一种类型,你知道先验:对象.

public void Bar<T>(T item)
{
    if (typeof(T).IsClass)
        this.Foo((object) item);
}

编辑:

另外,在你所说的一个评论中,你添加了类约束来实例化T.你不需要,你需要的是new constraint.

(编辑:李大同)

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

    推荐文章
      热点阅读