2011-11-25 17 views
10

aşağıda gibi sözlük dönüştürücü için basit bir nesneyi yazmaya çalışıyorum:WP7.1'de anonim tipler ve Erişim sağlayıcıları var mı?

public static class SimplePropertyDictionaryExtensionMethods 
{ 
    public static IDictionary<string,string> ToSimplePropertyDictionary(this object input) 
    { 
     if (input == null) 
      return new Dictionary<string, string>(); 

     var propertyInfos = from property in input.GetType() 
           .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty) 
          where property.CanRead 
          select property; 

     return propertyInfos.ToDictionary(x => x.Name, x => input.GetPropertyValueAsString(x)); 
    } 

    public static string GetPropertyValueAsString(this object input, PropertyInfo propertyInfo) 
    { 
     var value = propertyInfo.GetGetMethod().Invoke(input, new object[] {}); 
     if (value == null) 
      return string.Empty ; 

     return value.ToString(); 
    } 
} 

Ancak, ben aramaya çalıştığınızda böyle:

var test = (new { Foo="12", Bar=15 }).ToSimplePropertyDictionary(); 

O zaman bu bir istisna ile başarısız:

[System.MethodAccessException]: {"Attempt to access the method failed: .<>f__AnonymousType0`1.get_Foo()"} 

Bu sadece Mango üzerinde "Hayır" yazan güvenlik modeli mi? Etrafında bir yolu var mı? Bu halka açık bir erişimci gibi hissediyor - bu yüzden onu çağırmak mümkün gibi geliyor?

Stuart

cevap

8

sanırım senin ToSimplePropertyDictionary yöntemi ve gerçek kullanım iki ayrı mecliste. Bu, anonim bir sınıftan oluşturulan derleyici tarafından oluşturulan sınıf internal olduğundan, sorununun kaynağı budur. Bu nedenle MethodAccessException istisnasını alırsınız. Bu yüzden, çalışmasını sağlamak için InternalsVisibleToAttribute'u kullanmanız gerekir. Bu SO question iç türleri ve yansıması hakkında daha fazla bilgi içerir.

+0

Teşekkür ederiz! Bu iyi bir cevap gibi geliyor – Stuart

+0

Bir kazananımız var - teşekkürler! – Stuart

+0

mmm, iyi cevap. BindingFlags.Public özellikleri alırken geçtiği gibi bunu asla düşünmezdim. MSDN, özelliklerin herkese açık olduğunu (ana sınıfın olmaması durumunda garip görünüyor) olsa bile, anonim türde bir iç ise hiçbir özelliğin iade edilemeyeceğini düşünürdüm. – calum

1

Bu ınvokemember kullanırken bir özellik değeri elde etmek için kullanılır BindingFlags.GetProperty

çıkarın, bu salt okunur bir özellik döndü istediğinizi belirtmez.

DÜZENLEME: Sorun aslında propertyInfo.GetGetMethod() ile olabilir - (sadece hiç ilkini kullanmış) Aşağıdakilerden birini kullanmayı deneyin:

var value = propertyInfo.GetValue(input, null); 
var value = propertyInfo.GetGetMethod().Invoke(input, null); 
İlgili konular