如果有任何想法,我很喜欢这样做.我有通用的方法
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.