c# - 同一列表中的多个泛型类型并调用它们的方法

标签 c# generics

我正在利用业余时间制作一个对象验证框架来学习一些东西,并可能将其用于一些学校项目。

我有我的通用规则类,它看起来像这样:

class Rule<T>
{
    string propertyName;
    Func<T, bool> ruleLambda;

    bool IsBroken(T value)
    {
        return ruleLambda(value);
    }
}

要验证的对象看起来有点像这样:

class Example
{
    List<Rule<?>> MyRules; // can take all types of rules

    List<Rule<T>> Validate<T>(string propertyName, T value)
    {
        List<Rule<T>> brokenRules = new List<Rule<T>>();
        foreach (Rule rule in MyRules.Where(r => r.propertyName == propertyName))
        {
            if (rule.IsBroken(value))
                brokenRules.Add(rule);
        }
        return brokenRules;
    }
}

哪里T value参数将是 Example 类的属性之一的值,它可以是任何类型。

Validate<T>每当设置属性时调用方法。

问题在于类的规则列表。特别是 List<Rule<?>>上面的线。我想将给定类的所有规则存储在同一个列表中。

唉,C# 没有像 Java 那样的泛型类型的通配符。

我应该怎么做?

使用对象而不是 T 的非通用接口(interface)或基类可以工作,但我如何调用通用规则的 IsBroken方法而不是非通用方法?

最佳答案

我会将您的规则存储为 objectExample里面类和使用Enumerable.OfType<T>查找给定类型的匹配规则:

class Example
{
    private List<object> rules;

    List<Rule<T>> Validate<T>(string propertyName, T value)
    {
        return this.rules.OfType<Rule<T>>()
            .Where(r => r.PropertyName == propertyName && r.IsBroken(value))
            .ToList();
    }
}

关于c# - 同一列表中的多个泛型类型并调用它们的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12125374/

相关文章:

c# - 将 HttpContext.Session 与 use.Session() 一起使用时出现 System.InvalidOperationException;放

c# - 表达式选择方法

c# - asp.net MVC 4 通过不同的形式多次发布

Java 泛型 - 使用具有相同类名的类型实现具有两个泛型类型的方法

java - <T extends Comparable< 有问题吗? super T>>

C#:为什么 VS2005 中的代码编辑器选项卡之一上有一个星号?

c# - 从中间件中排除路由 - .net core

delphi - 从泛型参数继承在 Delphi XE 中不起作用

JAVA:泛型编译时间常量

c# - 将继承类型转换为泛型