如何在不向上转换的情况下指定委托的 return 类型?
How do I specify a delegate's return type without upcasting?
我有这个class:
class MyClass
{
public int Id { get; set; }
}
我可以使用 return 类型的对象和 return 整数 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;
}
...return 类型始终为整数:
.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
}
我一直在读到转换对性能有轻微影响,所以我宁愿根本不转换。另外,向上转型没有意义,因为一个对象总是在它上面的层次结构中的每个类型。
也许这根本不是问题,它不是 真正的 转换,它只是在查看表达式的调试信息时出现。
没有演员表是不可能做到的。在您的 ConcreteGetId
方法中, 是 到 object
的转换,只是不明确。
我有这个class:
class MyClass
{
public int Id { get; set; }
}
我可以使用 return 类型的对象和 return 整数 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;
}
...return 类型始终为整数:
.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
}
我一直在读到转换对性能有轻微影响,所以我宁愿根本不转换。另外,向上转型没有意义,因为一个对象总是在它上面的层次结构中的每个类型。
也许这根本不是问题,它不是 真正的 转换,它只是在查看表达式的调试信息时出现。
没有演员表是不可能做到的。在您的 ConcreteGetId
方法中, 是 到 object
的转换,只是不明确。