如何在没有向上转换的情况下指定委托的返回类型?

时间:2015-10-18 16:33:56

标签: .net casting expression-trees upcasting

我有这堂课:

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
}

我一直在读,铸造有轻微的性能打击,所以我宁愿不投。另外,由于对象总是在其上方的层次结构中的每个类型,因此向上转换没有意义。

也许这根本不是一个问题,它不是真的投射,它只是在查看表达式的调试信息时才出现。

1 个答案:

答案 0 :(得分:2)

没有演员表是不可能的。在ConcreteGetId方法中, 是对object的强制转换,它只是不明确。