我无法完成这项工作,我有动态结果,我需要将它选择为新对象。
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) });
答案 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) });
动态对象上的所有属性都需要命名。