0

在 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<> 允许我在内部找到 IDeleteValidaor 的每个实现,其中 T 是具体域对象类型、具体域对象类型实现的接口或递归基类型具体域对象类型一直延伸到对象.

当然我可以关闭域对象上的接口,我应该调用它对我来说没有意义

    Type unclosedValidatorType = typeof (TValidator).GetGenericTypeDefinition()

鉴于我俩都无法保证 TValidator 在编译时将是一个泛型类型,并且除了剥离它的关闭类型之外不会使用显式关闭的 TValidator ,这对我来说似乎是错误的做事方式。

我提供的伪代码显然具有功能,但是是否有一种类型安全的等效于将泛型方法的类型约束为给定接口的未封闭类型?

编辑以更正一些术语

4

1 回答 1

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
于 2012-11-28T16:38:32.327 回答