2012-01-23 21 views
14

Ben olsun bir DateTime alanını çarpana kadar ben gayet iyi çalışıyor sıralama için kullanıyorum bir ifade oluşturduk (ikinci satırda) hata aşağıdadır: türü 'System.DateTime' arasındaİfade dönüş türü için kullanılamaz 'System.Object'

İfade dönüş türü için kullanılamaz 'System.Object'

İşte benim kod:

ParameterExpression param = Expression.Parameter(typeof(MyEntity), "x"); 

Expression<Func<MyEntity, object>> sortExpression = 
    Expression.Lambda<Func<AMyEntity, object>>(
     Expression.Property(param, sortKey), param); 

Hiç kimse yardımcı olabilir mi?

+2

olası yinelenen (http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used- [türü 'System.ınt32' ifadesi dönüş türü 'System.Object' için kullanılamaz] geri dönüş tipi sistem nesne) – nawfal

cevap

30

Sadece orada bir dönüşümü ekleyin:

Expression<Func<MyEntity, object>> sortExpression = 
    Expression.Lambda<Func<AMyEntity, object>>(
     Expression.Convert(
      Expression.Property(param, sortKey), 
      typeof(object)), 
     param); 
10

Sen ifadenin dönüş tipi maç için değer türleri otomatik boks bekliyor gibi görünüyor. Ne yazık ki, Expression.Lambda bunu yapmaz.

Boksu gerçekleştirmek için Expression.Convert kullanabilirsiniz. mülkiyeti zaten bir referans tipi ise nedense dönüşüm işlemi ifadede mevcut olması istemiyorsanız gerektiği gibi

var body = Expression.Convert(Expression.Property(param, sortKey), typeof(object)); 
var sortExpression = Expression.Lambda<Func<AMyEntity, object>>(body, param); 

, sen dallara ayrılabilir: ait

Expression body = Expression.Property(param, sortKey); 

if(body.Type.IsValueType) 
    body = Expression.Convert(body, typeof(object)); 
+0

Mükemmel çalışır - çok teşekkürler! – Wildcat

İlgili konular