如何在不向上转换的情况下指定委托的 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 的转换,只是不明确。