web-dev-qa-db-fra.com

Définir la valeur du champ privé

Pourquoi le code suivant ne fonctionne pas:

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

J'essaie de définir la valeur d'un champ privé.


Voici l'exception que je reçois:

System.NullReferenceException non gérée Message = Référence d'objet pas défini sur une instance d'un objet. Source = ConsoleApplication7
Trace de la pile: sur Program.Main (String [] args) dans C:\Utilisateurs\Antonio\Desktop\ConsoleApplication7\ConsoleApplication7\Program.cs: line 18 sur System.AppDomain._nExecuteAssembly (RuntimeAssembly Assembly, String [] args) sur System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () sur System.Threading.ThreadHelper.ThreadStart_Context (état de l'objet) sur System.Threading.ExecutionContext.Run (ExecutionContext executionContext, rappel ContextCallback, état de l'objet, Boolean ignoreSyncCtx) sur System.Threading.ExecutionContext.Run (ExecutionContext executionContext, rappel ContextCallback, état de l'objet) à System.Threading.ThreadHelper.ThreadStart () InnerException:

23
Tono Nam

Essayez ceci (inspiré par Trouver un champ privé avec Reflection? ):

var prop = s.GetType().GetField("id", System.Reflection.BindingFlags.NonPublic
    | System.Reflection.BindingFlags.Instance);
prop.SetValue(s, "new value");

Mes modifications étaient d'utiliser la méthode GetField - vous accédez à un champ et non à une propriété et à ou NonPublic avec Instance.

56
nick_w

Évidemment, ajouter BindingFlags.Instance semble avoir résolu le problème:

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