在C#中是否可以约束泛型方法的类型参数,以便以类型安全的方式将其限制为非闭合类型的接口? 让我详细说明......
例如,我有以下伪代码:
public bool Validate<TValidator>(object validatable)
where TValidator : IValidator<>
{
// code that finds all implementations of IValidator that closes on
// recursive base types / interfaces of the validatable object
// return true if validates
}
我有几个实现IValidator的接口,例如ICreateValidator和IDeleteValidator。我可以很容易地在一个反射中收集我想要的验证器,而不是像我想要关闭所有类型T的方式那样通用,以及T的所有基类以及由T.实现的接口。
愿望能够按照
的方式来调用 var validates = Validate<IDeleteValidator<>>(concreteDomainObject);
这将为我提供未闭合类型的IDeleteValidator&lt;&gt;允许我在内部找到IDeleteValidaor的每个实现,其中T是concreteDomainObject类型,concreteDomainObject类型实现的接口,或者递归基类型concreteDomainObject类型一直扩展到object。
当然我可以关闭域对象上的界面,对我来说我不应该打电话
Type unclosedValidatorType = typeof (TValidator).GetGenericTypeDefinition()
鉴于我无法确定TValidator在编译时是一个通用类型,并且明确关闭的TValidator不会被使用,除了剥离它的结束类型这似乎是错误的做事方式给我。
我提供的psuedo代码显然是函数,但是有一个类型安全等效于constrian类型的泛型方法到一个非闭合类型的给定接口吗?
编辑以更正某些术语
答案 0 :(得分:1)
在C#中是否可以约束泛型方法的类型,以便以类型安全的方式将其限制为非闭合类型的接口?
没有。必须关闭类型参数,因此将类型参数约束为无法表示为类型参数的类型是没有意义的。
忘记约束部分 - 这个简单的代码不起作用:
using System;
class Test
{
static void Main()
{
Foo<Action<>>();
}
static void Foo<T>()
{
Console.WriteLine(typeof(T));
}
}
错误:
Test.cs(7,20): error CS1525: Invalid expression term '>'
Test.cs(7,23): error CS1525: Invalid expression term ')'
Test.cs(7,24): error CS1026: ) expected