给出以下代码以返回实现IValidateParameter
的新对象:
public static IValidateParameter GetValidator<TClass, TParameterType>(TParameterType objectToValidate)
where TClass : IValidateParameter
{
return (TClass) Activator.CreateInstance(typeof(TClass), objectToValidate);
}
例如,这个具体的实现:
public class DateRangeValidator : IValidateParameter
{
private readonly DateRange _dateRange;
private readonly Predicate<DateTime> _isNotMinValue = x => x != DateTime.MinValue;
private readonly Predicate<DateRange> _startIsBeforeEnd = x => x.Start < x.End;
public DateRangeValidator(DateRange dateRange)
{
_dateRange = dateRange;
}
public bool IsValid => _isNotMinValue(_dateRange.Start) &&
_isNotMinValue(_dateRange.End) &&
_startIsBeforeEnd(_dateRange);
}
使用上面的代码,根据构造函数签名,这将根据需要编译并运行,因为参数的类型为DateRange
。
var dateRangeCheck = ServiceFactory.GetValidator<DateRangeValidator, DateRange>(dateRange);
但是,这在设计时没有显示VS2017中的错误,但由于参数与构造函数签名不匹配而失败。
var dateRangeCheck = ServiceFactory.GetValidator<DateRangeValidator, bool>(true);
当实现IValidating
的类都将不同的类型对象作为参数时,如何修改泛型方法以获取设计时类型检查?
答案 0 :(得分:1)
如何使用IValidateParameter
通用接口,使用显示验证数据的类型参数?
public interface IValidateParameter<in T>
{
bool IsValid(T value);
}
然后你的具体实现就像是
public class DateRangeValidator : IValidateParameter<DateRange>
{
private readonly Predicate<DateTime> _isNotMinValue = x => x != DateTime.MinValue;
private readonly Predicate<DateRange> _startIsBeforeEnd = x => x.Start < x.End;
public bool IsValid(DateRange dateRange) =>
_isNotMinValue(dateRange.Start) &&
_isNotMinValue(dateRange.End) &&
_startIsBeforeEnd(dateRange);
}
然后你的服务工厂将是
public class ServiceFactory
{
public static IValidateParameter<TParameterType> GetValidator<TClass, TParameterType>()
where TClass : IValidateParameter<TParameterType>
{
return (TClass)Activator.CreateInstance(typeof(TClass));
}
}
你会像
一样使用它var validator = ServiceFactory.GetValidator<DateRangeValidator, DateRange>();
var result = validator.IsValid(dateRange);