2011-10-10 11 views
22

Conosco il nome di una proprietà nella mia classe C#. È possibile utilizzare la riflessione per impostare il valore di questa proprietà?Posso impostare un valore di proprietà con Reflection?

Ad esempio, supponiamo di sapere che il nome di una proprietà è string propertyName = "first_name";. E esiste actaully una proprietà chiamata first_name. Posso impostarlo usando questa stringa?

+0

Si tratta di una proprietà statica? – BoltClock

+1

Vorrei rinominare la domanda in: "È possibile utilizzare la riflessione per impostare il valore di una proprietà?" E la risposta è: sì, è possibile. Puoi farlo. –

+0

@Snowbear Non mi permetteva di usare Domanda nel titolo e doveva essere di 15 caratteri. Se non ti piace il titolo, quindi cambialo. – user489041

risposta

57

Sì, è possibile utilizzare il riflesso - è sufficiente recuperarlo con Type.GetProperty (specificando i flag di associazione se necessario), quindi chiamare SetValue in modo appropriato. Esempio:

using System; 

class Person 
{ 
    public string Name { get; set; } 
} 

class Test 
{ 
    static void Main(string[] arg) 
    { 
     Person p = new Person(); 
     var property = typeof(Person).GetProperty("Name"); 
     property.SetValue(p, "Jon", null); 
     Console.WriteLine(p.Name); // Jon 
    } 
} 

Se non è una proprietà pubblica, è necessario specificare BindingFlags.NonPublic | BindingFlags.Instance nella chiamata GetProperty.

-1

Qui di seguito è la mia prova frammento scritto in C# .NET

using System; 
using System.Reflection; 

namespace app 
{ 
    class Tre 
    { 
     public int Field1 = 0; 
     public int Prop1 {get;set;} 
     public void Add() 
     { 
      this.Prop1+=this.Field1; 
     } 
    } 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Tre o = new Tre(); 
      Console.WriteLine("The type is: {0}", o.GetType()); //app.Tre 

      Type tp = Type.GetType("app.Tre"); 
      object obj = Activator.CreateInstance(tp); 

      FieldInfo fi = tp.GetField("Field1"); 
      fi.SetValue(obj, 2); 

      PropertyInfo pi = tp.GetProperty("Prop1"); 
      pi.SetValue(obj, 4); 

      MethodInfo mi = tp.GetMethod("Add"); 
      mi.Invoke(obj, null); 

      Console.WriteLine("Field1: {0}", fi.GetValue(obj)); // 2 
      Console.WriteLine("Prop1: {0}", pi.GetValue(obj)); // 4 + 2 = 6 

      Console.ReadLine(); 
     } 
    } 
} 
Problemi correlati