Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用运行时生成泛型类型以使用OfType进行筛选<&燃气轮机;_C#_Generics_Reflection - Fatal编程技术网

C# 使用运行时生成泛型类型以使用OfType进行筛选<&燃气轮机;

C# 使用运行时生成泛型类型以使用OfType进行筛选<&燃气轮机;,c#,generics,reflection,C#,Generics,Reflection,所以在谷歌上翻来翻去,似乎无法恰当地用这个词来找到我在这里的答案 这就是我现在拥有的 使用这些接口,我将传入一个IConversionHelper列表 namespace InvestOne.Response.Mapper.Interfaces { public interface IConversionHelper { bool CanHelp(object value, Type destinationType); } public inte

所以在谷歌上翻来翻去,似乎无法恰当地用这个词来找到我在这里的答案

这就是我现在拥有的

使用这些接口,我将传入一个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);
    }
}
namespace InvestOne.Response.Mapper.Interfaces
{
公共接口IConversionHelper
{
bool CanHelp(对象值,类型destinationType);
}
公共接口IConversionHelper:IConversionHelper
{
T转换(对象值);
}
}
像这样

    public Mapper(IEnumerable<IConversionHelper> conversionHelpers)
    {
        _conversionHelpers = conversionHelpers;
    }
公共映射器(IEnumerable转换助手)
{
_转换助手=转换助手;
}
然后映射时将使用这些帮助程序,如下所示

            var propType = prop.PropertyType;
            var value = @from[spectraCode.Code];
            var conversionType = typeof (IConversionHelper<>).MakeGenericType(propType);
            var conversionHelpers = _conversionHelpers.OfType<conversionType>();
var-propType=prop.PropertyType;
var值=@from[spectraCode.Code];
var conversionType=typeof(IConversionHelper);
var conversionHelpers=_conversionHelpers.OfType();
问题在最后一行,我理解问题在于泛型需要在编译时出现,而现在不是。因此,尝试查找类似于在运行时创建泛型类型的内容(仅在本例中是在运行时过滤掉的)

理想的解决方案将为我提供与

  var conversionHelpers = _conversionHelpers.OfType<IConversionHelper<DateTime>>() 
var conversionHelpers=\u conversionHelpers.OfType()

如果属性类型是
DateTime
,以便稍后我可以调用
helper.Convert(value)
一个更简单的解决方案是使用
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()));
var-propType=prop.PropertyType;
var值=@from[spectraCode.Code];
var conversionType=typeof(IConversionHelper);
var conversionHelpers=\u conversionHelpers.Where(x=>conversionType.IsAssignableFrom(x.GetType());

当然,生成的序列不会是类型
IEnumerable
,但由于您在编译时不知道该类型,所以这无关紧要。

您可以使用手动创建的表达式树生成所需的内容。很抱歉,我现在无法向您提供更多详细信息,但这可能会为您指明正确的方向。查看@FrankJ,这是一个很好的建议,但需要找到一个更明确的类型,以便调用helper.Convert()。对我来说,使用IoC容器会容易得多,但这将是附加库im构建的一部分,因此它不能真正依赖于容器。如果这会导致类型==转换类型?@workayte的对象列表,它将导致类型序列
IEnumerable
,如果每个项目实际上都是类型
IConversionHelper
::我需要访问IConversionHelper中的convert方法,最后的转换实际上是这个问题的核心,因为在运行时键入内容的转换是我不确定如何克服的障碍。答案仍然很好,希望你能协助这场决赛pc@workabyte,这没有意义;如果在编译时不知道泛型类型参数,您如何编写调用泛型接口中定义的方法的代码?可能想在您的答案中加入这一点,但再多看一看,我发现我可以使用动态var类型,并且知道ll helpers将是类型化的
IConversionHelper
我可以调用convert方法,因此最后一行类似于
dynamicconversionHelpers=\u conversionHelpers.FirstOrDefault(x=>conversionType.IsAssignableFrom(conversionType)和&x.CanHelp(value,propType))