2009-08-18 56 views
15

Tôi có lớp (Khách hàng) chứa hơn 200 biến chuỗi làm thuộc tính. Tôi đang sử dụng phương pháp với tham số của khóa và giá trị. Tôi cố gắng cung cấp khóa và giá trị từ tệp xml. Đối với điều này, giá trị phải được thay thế bởi thuộc tính của lớp Customer (các biến chuỗi).chuỗi thành tên biến

tức

Customer 
{ 
    public string Name{return _name}; 

    public string Address{return _address}; 
} 


CallInput 
{ 
    StringTempelate tempelate = new StringTempelate(); 
    foreach(item in items) 
    tempelate .SetAttribure(item.key, item.Value --> //Say this value is Name, so it has to substitute Customer.Name 
} 

là nó có thể?

+6

Có thể bạn nên cân nhắc thiết kế lại lớp học của mình, 200 thuộc tính thật là điên rồ: p Nhưng đối với bạn, phương pháp phản chiếu là cách để đi. Bạn có thể sử dụng từ điển làm ví dụ. –

+0

Bạn đang tìm kiếm John

internets đường

+0

@ John Nolan, chỉ tương tự như – Mohanavel

Trả lời

20

Bạn có thể sử dụng phản chiếu để đặt thuộc tính 'theo tên'.

using System.Reflection; 
... 
myCustomer.GetType().GetProperty(item.Key).SetValue(myCustomer, item.Value, null); 

Bạn cũng có thể đọc các thuộc tính với GetValue, hoặc có được một danh sách tất cả tên thuộc tính sử dụng GetType(). GetProperties(), trả về một mảng của PropertyInfo (thuộc tính Name chứa tên tài sản)

13

Vâng, bạn có thể sử dụng Type.GetProperty(name) để nhận được PropertyInfo, sau đó gọi GetValue.

Ví dụ:

// There may already be a field for this somewhere in the framework... 
private static readonly object[] EmptyArray = new object[0]; 

... 

PropertyInfo prop = typeof(Customer).GetProperty(item.key); 
if (prop == null) 
{ 
    // Eek! Throw an exception or whatever... 
    // You might also want to check the property type 
    // and that it's readable 
} 
string value = (string) prop.GetValue(customer, EmptyArray); 
template.SetTemplateAttribute(item.key, value); 

Lưu ý rằng nếu bạn làm điều này rất nhiều bạn có thể muốn chuyển đổi các thuộc tính vào Func<Customer, string> trường hợp đại biểu - đó sẽ là nhiều nhanh hơn, nhưng phức tạp hơn. Xem bài đăng trên blog của tôi về creating delegates via reflection để biết thêm thông tin.

4

Sử dụng phản chiếu và đối tượng từ điển làm bộ sưu tập các mục của bạn.

Dictionary<string,string> customerProps = new Dictionary<string,string>(); 
Customer myCustomer = new Customer(); //Or however you're getting a customer object 

foreach (PropertyInfo p in typeof(Customer).GetProperties()) 
{ 
    customerProps.Add(p.Name, p.GetValue(customer, null)); 
} 
5

Phản ánh là tùy chọn, nhưng 200 thuộc tính ... rất nhiều. Khi nó xảy ra, tôi đang làm việc trên một cái gì đó như thế này vào lúc này, nhưng các lớp học được tạo ra bởi mã-gen. Để phù hợp với việc sử dụng "theo tên", tôi đã thêm một người lập chỉ mục (trong giai đoạn tạo mã):

public object this[string propertyName] { 
    get { 
     switch(propertyName) { 
      /* these are dynamic based on the the feed */ 
      case "Name": return Name; 
      case "DateOfBirth": return DateOfBirth; 
      ... etc ... 
      /* fixed default */ 
      default: throw new ArgumentException("propertyName"); 
     } 
    } 
} 

Điều này mang lại sự tiện lợi "theo tên", nhưng hiệu suất tốt.

Các vấn đề liên quan