2013-12-10 9 views
7

В настоящее время я пытаюсь преобразовать библиотеку приложений Xamarin.iOS в PCL. У меня есть этот код, который не будет компилировать:Portable Class Library Reflection GetField

private void SetPrivateField<T>(object item, string fieldName, object value) { 
     typeof(T).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic) 
      .SetValue(item, value); 
    } 

Как вы можете видеть, что я пытаюсь установить личное поле для типа. Есть ли другой способ?

EDIT Это компилируется. Будет ли это делать то же самое?

private void SetPrivateField<T>(object item, string fieldName, object value) { 
     typeof(T).GetRuntimeField(fieldName).SetValue(item,value); 
} 
+0

Что такое * компилятор? * Сообщалось об ошибке? – poupou

+0

@poupou Название 'BindingFlags' не существует в текущем контексте (im компиляция в visual studio) –

+0

Какой профиль вы используете? есть большая разница в отражении api, выставленном в 78 и 158 –

ответ

6

Это закончилось тем, что было правильным код.

private void SetPrivateField<T>(object item, string fieldName, object value) { 
    typeof(T).GetTypeInfo().GetDeclaredField(fieldName).SetValue(item,value); 
} 
+0

Правильный ответ. Для лучшей производительности обычно лучше кэшировать сеттеры. –

2

API-интерфейс отражения в портативных классах Библиотеки, предназначенные для новых платформ, различны. Смотрите следующие ссылки на некоторую информацию о том, почему мы сделали это и как использовать новый API:

Смежные вопросы