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
}
我一直在閱讀的內容中有輕微的表演命中,所以我寧願不投。另外,因爲一個對象總是處於其上層的層次結構中,所以沒有意義。
也許這根本就不是問題,它不是真的轉換,它看起來就是在查看錶達式的調試信息時。
那麼可以肯定地說,在我生成的委託中進行顯式轉換對於性能沒有任何不利影響? – oscilatingcretin
@ scilatingcretin,no。將值類型裝入對象總是會對性能造成負面影響,但這不是重點,因爲在這種情況下,您無法避免它(如果您希望代理返回'object')。 –
事情是,如果我沒有弄錯,你的ConcreteGetId也在做一個演員,只是不明確。 ConcreteGetId方法與編譯後的代表之間沒有性能差異。我想在IL級別上你會看到相同的代碼。如果我錯了,請糾正任何人! – MBoros