Портативная библиотека классов и отражение

Я создаю новое приложение для настольных компьютеров, Windows 8 и телефона Windows в одно и то же время. поэтому я создал библиотеку Portable Class, чтобы иметь общую функциональность на всех платформах. моя проблема в том, что когда я пытаюсь повторно использовать свой код внутри PCL, я не могу получить доступ к некоторым методам и свойствам внутри библиотеки. Согласно MSDN, эти методы поддерживаются, но теперь я знаю, почему я не могу получить к ним доступ.

        var property = memberExpression.Member as PropertyInfo;
        if (property == null)
        {
        }

        var getMethod = property.GetGetMethod(true);
        if (getMethod.IsStatic)
        {}

Вот фрагмент кода, который нельзя скомпилировать. GetGetMethod и IsStatic находятся внутри редактора Visual Studio. Я не знаю, почему это происходит и как получить доступ к этим свойствам.

поэтому, пожалуйста, если кто-то там когда-либо сделал что-то подобное, помогите мне скомпилировать этот код.

Ответ 1

Мы сделали некоторые рефакторинги в API отражения для приложений .NET для Windows Store. Подробнее см. В сообщении в блоге "Развитие API отражения" . Среди прочего, изменения API меняли в будущем для лучшей переносимости. Новые API-интерфейсы доступны в приложениях Windows Store,.NET 4.5 и Windows Phone 8. Для совместимости старые API, конечно, все еще доступны на .NET 4.5 и Windows Phone 8.

Для портативных библиотек классов, если вы ориентируетесь только на платформы, на которых поддерживаются новые API отражения, вы получите только новые API. Если вы добавите платформу, которая не поддерживает новые API, вы получите API.

PropertyInfo.GetGetMethod() не входит в состав новых API, поэтому вместо этого следует использовать PropertyInfo.GetMethod. MethodInfo.IsStatic является частью новых API-интерфейсов. Причина, по которой вы видели красные squiggles в Visual Studio, заключалась в том, что она не знала, какой тип getMethod был, потому что вы не использовали var и GetGetMethod().

Итак, ваш код должен выглядеть примерно так:

    var property = memberExpression.Member as PropertyInfo;
    if (property == null)
    {
    }

    var getMethod = property.GetMethod;
    if (getMethod != null && getMethod.IsStatic)
    {}

Ответ 2

Чтобы предоставить некоторую информацию о моем комментарии , используйте Type.GetMethod.

Метаданные из типа

При оценке метаданных, возвращаемых методами System.Type и свойства оператор равенства может возвращать разные результаты по разные платформы. В .NET Compact Framework каждый последующий вызов метода Type.GetMethod возвращает новый экземпляр System.Reflection.MethodInfo, поэтому возвращаемые значения никогда не оцениваются как равны. Однако в .NET Framework 4 вызов GetMethod с помощью те же параметры возвращают один и тот же экземпляр MethodInfo. Вы должны просматривать и, возможно, изменять код, когда вы работаете с следующие типы System.Reflection: MethodInfo, FieldInfo, PropertyInfo, EventInfo, MemberInfo, MethodBase, ConstructorInfo и ParameterInfo.

Отражение открытых открытых типов

В Windows Phone 7 отражение поддерживается на закрытых родовых типах; однако большинство операций отражения не поддерживаются открытым открытым типы. В открытых типах типов используются только следующие операции отражения поддерживаются для Windows Phone 7: получение открытого типа общего типа или метод, вызвав метод GetType или GetMethods. Создание родового типа или метода из открытого общего типа или метода, вызвав MakeGenericType или MakeGenericMethod. Для всех других отражений операции с открытыми генерируемыми типами, исключение NotSupportedExceptionвыброшены.

Источник: http://msdn.microsoft.com/en-us/library/gg597392.aspx