键入安全等效于将泛型方法的类型参数约束为未闭合类型的给定接口

时间:2012-11-28 16:33:54

标签: c# generics type-safety type-constraints generic-method

在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类型的泛型方法到一个非闭合类型的给定接口吗?

编辑

以更正某些术语

1 个答案:

答案 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