我可以用reflection设置属性值吗?

我知道我的C#类中的一个属性的名称。 是否有可能使用reflection设置此属性的值?

例如,说我知道一个属性的名称是string propertyName = "first_name"; 。 那里有一个名为first_name的属性。 我可以使用这个string来设置吗?

是的,你可以使用reflection – 只要用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 } } 

如果它不是公共财产,则需要指定BindingFlags.NonPublic | BindingFlags.Instance BindingFlags.NonPublic | BindingFlags.InstanceGetProperty调用中。

以下是我用C#.net编写的testing代码片段

 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(); } } }