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

  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • MofoHifi Records

    MofoHifi Rec

    15 HAZİRAN 2006
  • The Brister

    The Brister

    10 ŞUBAT 2008