【发布时间】:2018-09-04 14:48:41
【问题描述】:
我有一个针对接口运行的已编译 Lambda 函数。不幸的是,该接口只是一个标记接口,实际类型是在运行时动态生成的,并且具有我想要对其进行分组的属性。
这里有一些示例代码:
class Program
{
static void Main(string[] args)
{
// Just an example assignment: In the real life scenario the dynamic generated class is created during runtime.
IEnumerable<IDynamicGeneratedModelClass> list = GetDataFromService();
// get the 'real' type from the list
LambdaExpression lambdaExpression = DynamicExpression.ParseLambda(list.First().GetType(), typeof(object), "SomeProperty");
Func<IDynamicGeneratedModelClass, object> compiledLambdaFunction = (Func<IDynamicGeneratedModelClass, object>)lambdaExpression.Compile();
// Expected result: Group list on "SomeProp"
var result = list.GroupBy(compiledLambdaFunction);
}
private static IList<IDynamicGeneratedModelClass> GetDataFromService()
{
return new List<IDynamicGeneratedModelClass> {
new DynamicGeneratedModelClass("Class1"),
new DynamicGeneratedModelClass("Class2")
};
}
}
public interface IDynamicGeneratedModelClass
{}
public class DynamicGeneratedModelClass : IDynamicGeneratedModelClass
{
public DynamicGeneratedModelClass(string someProperty)
{
SomeProperty = someProperty;
}
public string SomeProperty { get; }
}
当 lambda 表达式被编译时,它会抛出以下异常:
System.InvalidCastException: '无法转换类型的对象 'System.Func`2[ConsoleApp12.DynamicGeneratedModelClass,System.Object]' 输入 'System.Func`2[ConsoleApp12.IDynamicGeneratedModelClass,System.Object]'。'
您能否给我一个提示我做错了什么以及如何解决它?
【问题讨论】: