2015-10-18 20 views
1

我有這個類:如何在沒有向上轉換的情況下指定委託的返回類型?

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 
} 

我一直在閱讀的內容中有輕微的表演命中,所以我寧願不投。另外,因爲一個對象總是處於其上層的層次結構中,所以沒有意義。

也許這根本就不是問題,它不是真的轉換,它看起來就是在查看錶達式的調試信息時。

回答

2

這是不可能沒有演員。在你的ConcreteGetId方法中,一個轉換爲object,這只是不明確。

+0

那麼可以肯定地說,在我生成的委託中進行顯式轉換對於性能沒有任何不利影響? – oscilatingcretin

+0

@ scilatingcretin,no。將值類型裝入對象總是會對性能造成負面影響,但這不是重點,因爲在這種情況下,您無法避免它(如果您希望代理返回'object')。 –

+0

事情是,如果我沒有弄錯,你的ConcreteGetId也在做一個演員,只是不明確。 ConcreteGetId方法與編譯後的代表之間沒有性能差異。我想在IL級別上你會看到相同的代碼。如果我錯了,請糾正任何人! – MBoros

相關問題