选择动态结果

时间:2014-08-15 09:48:57

标签: c# linq dynamic

我无法完成这项工作,我有动态结果,我需要将它选择为新对象。

var getMethod = SubType.BaseType.BaseType.GetMethod("List").MakeGenericMethod(SubType);

dynamic result = getMethod.Invoke(null, new object[] { UId.ToGuid() });

return ((IEnumerable)result.Value).Select(c => new { c.UId, Text = GetPropertyValue(c, SubText) });

2 个答案:

答案 0 :(得分:1)

这并不容易。您还必须使用Reflection作为Select。您需要使用MakeGenericMethod传递SubType并获得Select的正确重载。

然后你还需要创建一个Func<>委托,然后将其传递给Select Invoke方法。我建议你创建一个命名类型而不是选择匿名类型然后创建一个Func会更简单。您可以通过Reflection找到有关如何创建代理类型的更多信息here

以下是一些示例代码:

var select = typeof (Enumerable)
        .GetMethods(BindingFlags.Static | BindingFlags.Public)
        .First(m => m.Name == "Select" &&
                    m.GetParameters()[1].ParameterType.GetGenericArguments().Length == 2);

var selectMethod = select.MakeGenericMethod(typeof(SubType));

var func = typeof(Func<>).MakeGenericType(SubType, ResultType);

...

答案 1 :(得分:-1)

尝试将最后一行更改为:

return ((IEnumerable)result.Value).Select(c => new { UId = c.UId, Text = GetPropertyValue(c, SubText) });

动态对象上的所有属性都需要命名。