【发布时间】:2012-08-25 20:25:35
【问题描述】:
我正在利用业余时间制作一个对象验证框架来学习一些东西,并可能将其用于一些学校项目。
我有我的通用 Rule 类,看起来像这样:
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 的非泛型接口或基类可以工作,但我如何调用泛型 Rule 的 IsBroken 方法而不是非泛型方法?
【问题讨论】:
-
定义一个接口 IRule,具有非通用接口,例如
bool IsBroken (object),有Rule<X>: IRule,有List<IRule>.. 好吧,它不是很漂亮,但它确实有效,并且是我见过的最好的。