Анонимные типы и Get accessors на WP7.1? - PullRequest
10 голосов
/ 25 ноября 2011

Я пытаюсь записать простой объект в словарь-конвертер, как показано ниже:

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();
    }
}

Однако, когда я пытаюсь вызвать это как:

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

Затем происходит сбой сисключение:

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

Это просто модель безопасности в Mango, говорящая «Нет»?Есть ли способ обойти это?Такое ощущение, что это общедоступный метод доступа Get - значит, я должен его вызывать?

Stuart

Ответы [ 2 ]

8 голосов
/ 25 ноября 2011

Я полагаю, что ваш ToSimplePropertyDictionary метод и фактическое использование находятся в двух отдельных сборках.Это источник вашей проблемы, потому что класс, сгенерированный компилятором, который сгенерирован из анонимного класса - internal.Вот почему вы получаете исключение MethodAccessException.Поэтому вам нужно использовать InternalsVisibleToAttribute , чтобы заставить его работать.Этот SO вопрос содержит больше информации о внутренних типах и рефлексии.

1 голос
/ 25 ноября 2011

Удалить BindingFlags.GetProperty

Используется для получения значения свойства при использовании InvokeMember, но не указывает, что вы хотите вернуть свойство только для чтения.

РЕДАКТИРОВАТЬ: Проблема может на самом делебыть с propertyInfo.GetGetMethod () - Попробуйте использовать один из следующих (я только когда-либо использовал первый):

var value = propertyInfo.GetValue(input, null);
var value = propertyInfo.GetGetMethod().Invoke(input, null); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...