Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.1K
Vistas
Establecer propiedad de instancia sin Setter

Supongamos que tengo una clase y una interfaz que se ve así:

 [Serializable] public class MyClass : IClass { public int Prop => 42; } public interface IClass { int Prop { get; } }

Como puede ver, no hay Setter. Pero esperaba usar la reflexión para cambiar la propiedad Prop, pero parece que no puedo hacerlo. Esto es lo que tengo hasta ahora:

 var property = typeof(MyClass).GetProperty("Prop", BindingFlags.Instance | BindingFlags.Public); property.SetValue(instaneOfClass, 31);

Sigo recibiendo este error: System.ArgumentException: Property set method not found.

¿No debería funcionar esto? ¿Cómo puedo establecer la propiedad sin usar un setter?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Las propiedades implementadas automáticamente tienen campos de respaldo llamados <PropName>k__BackingField .

En su caso, accedería a este campo de respaldo de esta manera:

 var property = typeof(MyClass).GetField("<Prop>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic); property.SetValue(instanceOfClass, 31);

Tenga en cuenta que estoy llamando a GetField() en lugar de GetProperty() y usando BindingFlags.NonPublic en lugar de BindingFlags.Public , ya que el campo de respaldo es privado.

Sin embargo, dado que se trata de un miembro con cuerpo de expresión (sintaxis lambda), no se genera ningún campo de respaldo. En lugar de depender de otro miembro, el captador simplemente devuelve el resultado de la expresión dada y el compilador no necesita generar un campo de respaldo.

La implementación de su propiedad con un getter explícito generará un campo de respaldo y el código anterior funcionará.

 public class MyClass : IClass { public int Prop { get; } = 42; }
over 4 years ago · Santiago Trujillo Denunciar

0

Si especifica un captador, tendrá un campo generado por el compilador que contiene el nombre de la propiedad. Luego puede modificar el valor de este campo usando la reflexión (GetFields, SetValue):

 public class Foo { public Foo() => Bar = 42; public int Bar { get; } static void Main() { var f = new Foo(); Console.WriteLine(f.Bar); // ==> 42; f.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic).First(x => x.Name.Contains("Bar")).SetValue(f, 43); Console.WriteLine(f.Bar); // ==> 43; } }

No funciona para una propiedad calculada como en su ejemplo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda