我有这堂课:
class MyClass
{
public int Id { get; set; }
}
我可以使用返回类型的对象创建此具体方法,并返回整数Id而不进行向上转换:
object ConcreteGetId(MyClass mc)
{
return mc.Id;
}
但是,当我尝试使用表达式生成委托时......
static Delegate GenerateGetId()
{
Type MyType = typeof(MyClass);
ParameterExpression EntityParameter = Expression.Parameter(MyType);
MemberExpression Property = Expression.Property(EntityParameter, MyType.GetProperty("Id"));
LambdaExpression Lambda = Expression.Lambda(Property, EntityParameter);
Delegate d = Lambda.Compile();
return d;
}
...返回类型始终为整数:
.Lambda #Lambda1<System.Func`2[MyNamespace.MyClass,System.Int32]>(MyNamespace.MyClass $var1)
{
$var1.Id
}
我希望它编译为Func<MyClass, object>
,但我知道如何执行此操作的唯一方法是将ID转换为对象,如下所示:
LambdaExpression Lambda = Expression.Lambda(Expression.TypeAs(Property, typeof(object)), EntityParameter);
编译到这个:
.Lambda #Lambda1<System.Func`2[MyNamespace.MyClass,System.Object]>(MyNamespace.MyClass $var1)
{
$var1.Id .As System.Object
}
我一直在读,铸造有轻微的性能打击,所以我宁愿不投。另外,由于对象总是在其上方的层次结构中的每个类型,因此向上转换没有意义。
也许这根本不是一个问题,它不是真的投射,它只是在查看表达式的调试信息时才出现。
答案 0 :(得分:2)
没有演员表是不可能的。在ConcreteGetId
方法中, 是对object
的强制转换,它只是不明确。