2015-01-12 6 views
5

yerine Genel tür içinde özellik bulmam gerekiyor. Bu eski bir yoldur (ve benim kod WinRT için adamıştır beri ben başka bir yaklaşım gerektiğine inanıyorum):GetRuntimeProperties, GetProperty

PropertyInfo pi = typeof(TRp).GenericTypeArguments[0].GetProperty(idField, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); 

Ben GetRuntimeProperties kullanarak aynı sonucu elde etmek gerekir.

PropertyInfo pi = typeof(TRp).GenericTypeArguments[0].GetRuntimeProperties().Single(p => p.Name.ToUpper() == idField.ToUpper()... 

muhtemelen daha iyi yapılabilir, ben özel bir şekilde IgnoreCase uygulamaya görebileceğiniz gibi: Bu benim yaklaşımdır?
Kalan BindingFlags'u nasıl uygularım?

Teşekkür ederiz!

cevap

5

Aslında gerek yok. Bu Type.GetRuntimeTypes nasıl uygulandığını geçerli:

public static IEnumerable<PropertyInfo> GetRuntimeProperties(this Type type) 
{ 
    CheckAndThrow(type); 

    IEnumerable<PropertyInfo> properties = type.GetProperties(everything); 
    return properties; 
} 

everything aşağıdaki gibi tanımlanır Nerede: Zaten sizin gerekli bayraklar arayacaktır anlamına

private const BindingFlags everything = BindingFlags.Instance | 
             BindingFlags.Public | 
             BindingFlags.NonPublic | 
             BindingFlags.Static; 

.

Düzenleme: Bu test edilmemiştir

public static class TypeExtensions 
{ 
    public static IEnumerable<PropertyInfo> GetAllProperties(this TypeInfo type, 
                  BindingFlags bindingFlags) 
    { 
     var propertyInfos = type.GetProperties(bindingFlags); 

     var subtype = type.BaseType; 
     if (subtype != null) 
      list.AddRange(subtype.GetTypeInfo().GetAllProperties(bindingFlags)); 

     return propertyInfos.ToArray(); 
    } 
} 

Not: Kendini BindingFlags belirtmek isterseniz, kendi özel uzatma yöntemi yazabilir

. Sadece kendiniz yapabileceğinizi size göstermek için bir girişimdir.

+0

1. Nasıl uygulandığını nasıl anladınız? –

+0

2. BindingFlags'ın bazılarını değiştirmek istersem ne olur? –

+1

1. Gönderiye bir link ekledim ('Type.GetRuntimeTypes' üstüne tıklayın). 2. Maalesef yapamazsın. –

İlgili konular