Установленное значение частного поля
Почему следующий код не работает:
class Program
{
static void Main ( string[ ] args )
{
SomeClass s = new SomeClass( );
s.GetType( ).GetField( "id" , System.Reflection.BindingFlags.NonPublic ) // sorry reasently updated to GetField from GetProperty...
.SetValue( s , "new value" );
}
}
class SomeClass
{
object id;
public object Id
{
get
{
return id;
}
}
}
Я пытаюсь установить значение частного поля.
Вот результат, который я получаю:
Исправление System.NullReferenceException необработанное Message = Ссылка на объект не установлен в экземпляр объекта. Источник = ConsoleApplication7
Трассировки стека: в Program.Main(String [] args) в C:\Users\Antonio\Desktop\ConsoleApplication7\ConsoleApplication7\Program.cs: строка 18 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, String [] args) в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart() InnerException:
Ответы
Ответ 1
Попробуйте это (вдохновлено Найдите частное поле с отражением?):
var prop = s.GetType().GetField("id", System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance);
prop.SetValue(s, "new value");
Мои изменения заключались в использовании метода GetField
- вы обращаетесь к полю, а не к свойству, и к или NonPublic
с помощью Instance
.
Ответ 2
Очевидно, добавление BindingFlags.Instance
, похоже, решило его:
> class SomeClass
{
object id;
public object Id
{
get
{
return id;
}
}
}
> var t = typeof(SomeClass)
;
> t
[Submission#1+SomeClass]
> t.GetField("id")
null
> t.GetField("id", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
> t.GetField("id", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
[System.Object id]
>