2011-10-10 28 views
22

Tôi biết tên của một thuộc tính trong lớp C# của tôi. Có thể sử dụng phản chiếu để đặt giá trị của thuộc tính này không?Tôi có thể đặt giá trị thuộc tính với Reflection không?

Ví dụ: giả sử tôi biết tên thuộc tính là string propertyName = "first_name";. Và có actaully tồn tại một tài sản gọi là first_name. Tôi có thể đặt nó bằng chuỗi này không?

+0

Có một tài sản tĩnh? – BoltClock

+1

Tôi sẽ đổi tên câu hỏi thành: "Có thể sử dụng phản chiếu để đặt giá trị của thuộc tính không?" Và câu trả lời là: Vâng, có thể. Bạn có thể làm được. –

+0

@Snowbear Nó sẽ không cho phép tôi sử dụng Câu hỏi trong tiêu đề, và cần phải có 15 ký tự. Nếu bạn không thích tiêu đề, sau đó thay đổi nó. – user489041

Trả lời

57

Có, bạn có thể sử dụng sự phản chiếu - chỉ cần tìm nạp nó với Type.GetProperty (chỉ định cờ ràng buộc nếu cần), sau đó gọi SetValue một cách thích hợp. Mẫu:

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

Nếu nó không phải là một tài sản công cộng, bạn sẽ cần phải xác định BindingFlags.NonPublic | BindingFlags.Instance trong GetProperty gọi.

-1

Dưới đây là đoạn thử nghiệm của tôi viết bằng 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(); 
     } 
    } 
} 
Các vấn đề liên quan