在谷歌附近挖了一下,似乎无法正确地说出这个问题来找到我在这里的答案。
这就是我目前所拥有的
使用这些接口,我将传入IConversionHelper
列表namespace InvestOne.Response.Mapper.Interfaces
{
public interface IConversionHelper
{
bool CanHelp(object value, Type destinationType);
}
public interface IConversionHelper<out T> :IConversionHelper
{
T Convert(object value);
}
}
喜欢这样
public Mapper(IEnumerable<IConversionHelper> conversionHelpers)
{
_conversionHelpers = conversionHelpers;
}
然后当映射将使用这样的帮助器
var propType = prop.PropertyType;
var value = @from[spectraCode.Code];
var conversionType = typeof (IConversionHelper<>).MakeGenericType(propType);
var conversionHelpers = _conversionHelpers.OfType<conversionType>();
问题出在最后一行,我理解问题是泛型需要在编译时,而现在却不是。所以试图找到类似于在运行时创建泛型类型的东西,仅在这种情况下在运行时过滤掉。
理想的解决方案将为我提供与
等效的通用运行时 var conversionHelpers = _conversionHelpers.OfType<IConversionHelper<DateTime>>()
如果属性类型为DateTime
,以便稍后我可以调用helper.Convert(value)
答案 0 :(得分:2)
更简单的解决方案是使用Where
:
var propType = prop.PropertyType;
var value = @from[spectraCode.Code];
var conversionType = typeof (IConversionHelper<>).MakeGenericType(propType);
var conversionHelpers = _conversionHelpers.Where(x => conversionType.IsAssignableFrom(x.GetType()));
当然,生成的序列不是IEnumerable<IConversionHelper<DateTime>>
类型,但由于您无论如何都不知道编译时的类型,因此无关紧要。