2017-02-06 5 views
0

IValidationインターフェイスを継承する検証クラスを追加するリストがありますが、今ではリフレクションを明示的に使用したい場合は、ISpecialCaseRequestValidationインターフェイスを継承するすべてのクラスを明示的に使用します。私はすでにISpecialCaseRequestValidationインターフェイスにIValidationからIsValidを移動するので、今、私は、!v.IsValidにエラーが発生しているC#インターフェイスリフレクションを使用するコードをリファクタリングするには

private static List<IValidation> _validations = new List<IValidation>(); 

static Validations() 
{ 
} 

public static bool IsValid(SpecialCaseRequest specialCase, out HttpResponseMessage response) 
{ 
    var result = _validations.FirstOrDefault(v => !v.IsValid(SpecialCase, out error)); 
    if (result != null) 
    { 
     return false; 
    } 
    return true; 
} 

は、ここに私のバリデーションクラスです。ここに私のインターフェイスは、次のとおりです。

public interface ISpecialCaseRequestValidation: IValidation 
{ 
    bool IsValid(SpecialCaseRequest specialCase, out Error error); 
} 
public interface IValidation 
{ 
} 

そしてここでは、ISpecialCaseRequestValidationインターフェースを継承する私のクラスです:

public class NameValidation : ISpecialCaseRequestValidation 
{ 
    public bool IsValid(SpecialCaseRequest specialCase, out Error error) 
    { 
     if (condition) 
     { 
      return false; 
     } 
     return true; 
    } 
} 

public class ExpirationDateTimeValidation : ISpecialCaseRequestValidation{} 

public class AgeValidation : ISpecialCaseRequestValidation{} 

はどうすれば反射して、これらのインタフェースを定義することができ、それがISpecialCaseRequestValidationインタフェースとラムダを継承するすべてのクラスを通過しますIsValidメソッドを選択する式?

UPDATE:

まあ、私はすべてのクラスのアセンブリを持っていると私はそれらを参照してください名前:

Assembly a = typeof(ISpecialCaseRequestValidation).Assembly; 
var list = a.GetTypes().Where(type => type != typeof(ISpecialCaseRequestValidation) && typeof(ISpecialCaseRequestValidation).IsAssignableFrom(type)).ToList(); 

しかし、問題は、私はvar listを使用していたとき、私はクラスにIsValidメソッドにアクセスすることができないということです、私はクラスの属性だけを見ることができます。

+1

将来コードを適切にインデントするために時間をとってください。あなたの質問は、できるだけ読みやすく理解していることが非常に重要です。 –

+0

正確にあなたが何を求めているのか、なぜあなたはそれが反映されるべきなのか、私には少し不明です。単にISpecialCaseRequestValidationとしての検証を探していませんか? – CodeCaster

+0

@CodeCasterよく将来のIValidationインターフェイスではISpecialCaseRequestValidionだけでなく、他の人にも適応できるので、今後のケースでは反射が必要です – BinaryTie

答えて

0

を書くことができることを追加したい:

static Validations() 
{ 
Assembly a = typeof(ISpecialCaseRequestValidation).Assembly; 
      _validationTypes = 
       a.GetTypes() 
        .Where(
         type => 
          type != typeof(ISpecialCaseRequestValidation) && 
          typeof(ISpecialCaseRequestValidation).IsAssignableFrom(type)) 
        .ToList(); 
} 

ここで私はのアセンブリを取得していますインタフェースクラスを作成し、それをリストに入れます。

public static bool IsValid(SpecialCaseRequest specialCase, out HttpResponseMessage response) 
{ 
    object[] mParam = new object[] { signingCase, new Error() }; 
     foreach (Type type in _validationTypes) 
     { 
      var obj = Activator.CreateInstance(type); 
      var isValidMethod = type.GetMethod("IsValid"); 
      var isValid = (bool) isValidMethod.Invoke(obj, mParam); 
     } 
    if (result != null) 
    { 
     return false; 
    } 
    return true; 
} 

オブジェクト[]では、isValid変数で呼び出されたすべてのIsValid()メソッドを渡します。

-1

は、私の知る限りはそれを見るようにあなたのインターフェイス宣言があることを変更する必要があります。

public interface ISpecialCaseRequestValidation: IValidation 
{ 
} 
public interface IValidation 
{ 
    bool IsValid(SpecialCaseRequest specialCase, out Error error); 
} 

ISpecialCaseRequestValidationから継承するすべてのクラスはIsValidを実装する必要がありますので、すべてのクラスIValidationから継承されます。私はIValidationの子供たちも妥当性をチェックしなければならないと考えているので、これをお勧めします。

私はこの方法でそれを解決し、あなたが

public static bool IsValid(SpecialCaseRequest specialCase, out HttpResponseMessage response) => 
    _validations.All(v => v.IsValid(specialCase, out error)); 

代わりの

public static bool IsValid(SpecialCaseRequest specialCase, out HttpResponseMessage response) 
{ 
    var result = _validations.FirstOrDefault(v => !v.IsValid(SpecialCase, out error)); 
    if (result != null) 
    { 
     return false; 
    } 
    return true; 
} 
関連する問題