2011-10-10 13 views
22

私はC#クラスのプロパティの名前を知っています。反射を使用してこのプロパティの値を設定することは可能ですか?Reflectionでプロパティ値を設定できますか?

たとえば、プロパティの名前がstring propertyName = "first_name";であることがわかっているとします。そしてそこにはfirst_nameと呼ばれるプロパティが存在します。この文字列を使って設定できますか?

+0

で書かれた私のテストスニペットは、それは静的プロパティですか? – BoltClock

+1

私は質問の名前を「リフレクションを使ってプロパティの値を設定できますか?答えは:はい、可能です。あなたはそれを行うことができます。 –

+0

@SnowbearタイトルでQuestionを使用することができず、15文字にする必要がありました。タイトルが気に入らなければ、それを変更してください。 – user489041

答えて

57

はい、反射を使用することができます - Type.GetProperty(必要に応じてバインディングフラグを指定)でフェッチしてから、SetValueを適切に呼び出してください。サンプル:それは公共の財産ではない場合

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 
    } 
} 

、あなたがGetProperty呼び出しでBindingFlags.NonPublic | BindingFlags.Instanceを指定する必要があります。以下は

-1

は、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(); 
     } 
    } 
} 
関連する問題