c# - org - mapwindows 5
Establecer valor de campo privado (2)
Evidentemente, agregar BindingFlags.Instance
parece haberlo resuelto:
> 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]
>
¿Por qué el siguiente código no funciona?
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;
}
}
}
Estoy tratando de establecer el valor de un campo privado.
Aquí está la excepción que recibo:
System.NullReferenceException no se manejó Mensaje = La referencia del objeto no se estableció en una instancia de un objeto. Fuente = ConsoleApplication7
StackTrace: en Program.Main (String [] args) en C: / Users / Antonio / Desktop / ConsoleApplication7 / ConsoleApplication7 / Program.cs: line 18 en System.AppDomain._nExecuteAssembly (RuntimeAssembly assembly, String [] args) en System. AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAunciapayunidad en el Estado de la mano en el lugar de trabajo en el lugar de trabajo. , Devolución de llamada de ContextCallback, estado del objeto, ignoreSyncCtx booleano en System.Threading.ExecutionContext.Run (ejecución de ExecutionContext, contexto, devolución de llamada de ContextCallback, estado del objeto) en System.Threading.ThreadHelper.ThreadStart () InnerException:
Prueba esto (inspirado en ¿ Buscar un campo privado con Reflexión? ):
var prop = s.GetType().GetField("id", System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance);
prop.SetValue(s, "new value");
Mis cambios fueron para utilizar el método GetField
: está accediendo a un campo y no a una propiedad, y no a NonPublic
con Instance
.