使用运行时生成通用类型来过滤使用OfType<>

时间:2015-08-06 21:32:40

标签: c# generics reflection

在谷歌附近挖了一下,似乎无法正确地说出这个问题来找到我在这里的答案。

这就是我目前所拥有的

使用这些接口,我将传入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)

1 个答案:

答案 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>>类型,但由于您无论如何都不知道编译时的类型,因此无关紧要。