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

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • Disney Pets and Animals

    Disney Pets

    29 ŞUBAT 2012
  • taliajoy18

    taliajoy18

    12 Temmuz 2011