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
メソッドにアクセスすることができないということです、私はクラスの属性だけを見ることができます。
将来コードを適切にインデントするために時間をとってください。あなたの質問は、できるだけ読みやすく理解していることが非常に重要です。 –
正確にあなたが何を求めているのか、なぜあなたはそれが反映されるべきなのか、私には少し不明です。単にISpecialCaseRequestValidationとしての検証を探していませんか? – CodeCaster
@CodeCasterよく将来のIValidationインターフェイスではISpecialCaseRequestValidionだけでなく、他の人にも適応できるので、今後のケースでは反射が必要です – BinaryTie