私はオブジェクト内のすべてのプロパティの値を検証する必要がある同じパターンの必要性を、コード内で実行し続けます。擬似コードは次のようになります。実行時にのみ知られているタイプによる動的ディスパッチ
bool ValidateMe(object c) {
var properties = GetProperties(c);
foreach (var property in properties) {
var value = property.GetValue(c);
if (!IsValid(value)) {
return false;
}
}
return true;
}
bool IsValid(int value)
{
return value != int.MaxValue;
}
bool IsValid(double value)
{
return value != double.MaxValue;
}
bool IsValid(object value)
{
return value != null;
} // etc.
私は、コードが動的に(値がnullでないと仮定しproperty.PropertType
またはvalue.GetType()
を呼び出すことによって見つけることができます)、オブジェクトのタイプに基づいて正しい方法に値を派遣したいと思います。
私はこの仕事をするために発見した唯一の方法は、このようなものです:
interface IValidator {
bool IsValid(object value);
}
class PredicateValidator<T> : IValidator {
private Predicate<T> method;
PredicateValidator(Predicate<T> method) {
this.method = method;
}
bool IsValid(object value) {
return IsValid((T) value);
}
bool IsValid(T value) {
return method.invoke(value);
}
}
var validationsByType = new Dictionary<Type,IValidator>();
validationsByType[typeof(double)]=new PredicateValidator<double>(IsValid);
validationsByType[typeof(double)]=new PredicateValidator<int>(IsValid);
、その後、地図の種類によって方法を修正するために、オブジェクトを派遣できます
object value = property.GetValue(c);
bool result = validationsByType[c.GetType()].IsValid(value);
が原産であります実行時にこのタイプの動的ディスパッチを行うためのC#(つまり言語機能)?
Dictionary>を作成して、バリデータクラスを追加することなく同じことを行うことはできますが、このアプローチはうまく見えます。 –
Evk
@evk:良い点、ありがとう。 –
コードが実際に正常に動作しているので、私はこの質問を議論の対象外としています。多分、http://codereview.stackexchange.com/に投稿してください。 – nozzleman