私は暇なときにオブジェクト検証フレームワークを作成して、いくつかのことを学び、学校のプロジェクトに使用するかもしれません。
私は一般的な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クラスのプロパティの1つの値であり、任意のタイプにすることができます。
Validate<T>
プロパティが設定されるたびにメソッドが呼び出されます。
問題は、クラスのルールのリストにあります。具体的にはList<Rule<?>>
上記の行。特定のクラスのすべてのルールを同じリストに保存したいと思います。
残念ながら、C#にはJavaのようなジェネリック型のワイルドカードがありません。
これはどのようにすればよいですか?
Tの代わりにオブジェクトを利用する非ジェネリックインターフェイスまたは基本クラスは機能する可能性がありますがIsBroken
、非ジェネリックルールではなくジェネリックルールのメソッドをどのように呼び出すのでしょうか?