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

前端之家收集整理的这篇文章主要介绍了c# – 在运行时添加通用约束?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果有任何想法,我很喜欢这样做.我有通用的方法
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.

猜你在找的C#相关文章