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:
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
.
É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]
>