Установленное значение частного поля

Почему следующий код не работает:

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]
>