SORU
25 AĞUSTOS 2010, ÇARŞAMBA


Neden bazı nesne özellikleri UnaryExpression ve diğerleri MemberExpression?

Benim için cevap hareket Select a model property using a lambda and not a string property name aşağıdaki gibi bir toplama için özellikler eklemek isteyen soru

var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);

Include yöntemi aşağıdaki kodu yazdım:

public class PropertyCollection<T>
{
    public void Include(Expression<Func<T, object>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression != null)
        {
            var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
            Properties.Add(pes.Property.Property.Name, pes.Property);
            return pes;
    }

Bununla birlikte, kodu çalıştıran, Lambda bazı vermiştir buldumMemberExpressionbeklendiği gibi değerler, ama diğerleri vermiştirUnaryExpressiondeğerler. Tüm özellikleri Lambda kullanarak ekleyebilirim önce aşağıdaki kodun ilk satırı değiştirmek zorunda kaldım:

var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;

Tüm özelliklerini 'basit' tür, yani string, DateTime, int, bool, vb vardır. POCO iş bir nesne. Birkaç değişik ile dekore edilmiştirEğlence devri açmıştıröznitelikleri.

Ne benim örnekte Lambda bazı verim neden olurMemberExpressiondeğerler ve diğerleriUnaryExpressiondeğerleri? Benim örnekte, ilkUnaryExpressionüçüncü satırda iseDateTimeözellik, ama Boole özellikleri de neden olurUnaryExpressions.

CEVAP
26 AĞUSTOS 2010, PERŞEMBE


Sorunun ne olduğunu biliyorum sanırım. İfade döner tip object.

Eğer bu 9 ** değiştirirseniz dönüş türü doğru çıkarılmamalıdır, ve UnaryExpression bazı boks operasyon olduğunu varsayıyorum) ortaya çıkmaz.

Güncelleme:

Include imza: olmalıdır

public void Include<T, R>(Expression<Func<T, R>> expression)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • failblog

    failblog

    17 HAZİRAN 2008
  • Project Mooncircle

    Project Moon

    6 Aralık 2009