У меня есть список, в котором я добавляю классы проверки, которые наследуют интерфейс 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
метод, Я вижу только атрибуты классов.
Пожалуйста, уделите больше времени, чтобы отложить свой код в будущем. Очень важно, чтобы ваш вопрос был так же прост в чтении и понимании, насколько это возможно. –
Мне немного непонятно, что именно вы спрашиваете и почему вы думаете, что вам нужно отразить это. Разве вы не просто ищете 'validation as ISpecialCaseRequestValidation'? – CodeCaster
@CodeCaster хорошо Мне нужно отражение для будущих случаев, потому что, возможно, в будущем интерфейс IValidation может быть адаптирован не только к ISpecialCaseRequestValidion, но и для других, а также для – BinaryTie