我正在利用业余时间制作一个对象验证框架来学习一些东西,并可能将其用于一些学校项目。
我有我的通用规则类,它看起来像这样:
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
方法而不是非通用方法?
最佳答案
我会将您的规则存储为 object
在Example
里面类和使用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/