Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.1K
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!