2017-02-06 2 views
0

У меня есть список, в котором я добавляю классы проверки, которые наследуют интерфейс IValidation, но теперь я хотел бы использовать отражение явно для всех классов, наследующих интерфейс ISpecialCaseRequestValidation.C# Как я могу использовать код рефакторинга для отражения интерфейса

Вот мой Validation класс:

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; 
} 

Теперь у меня есть ошибки на !v.IsValid, потому что я уже переехал IsValid из IValidation в ISpecialCaseRequestValidation интерфейс. Вот мои интерфейсы:

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

Мне немного непонятно, что именно вы спрашиваете и почему вы думаете, что вам нужно отразить это. Разве вы не просто ищете 'validation as 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; 
} 
Смежные вопросы