2011-06-21 69 views
9

phép nói rằng tôi cóSử dụng phản ánh để có được giá trị của thuộc tính có tên trong một trường hợp lớp

class Person 
{ 
    public Person(int age, string name) 
    { 
     Age = age; 
     Name = name; 
    } 
    public int Age{get;set} 
    public string Name{get;set} 
} 

và tôi muốn tạo ra một phương pháp mà chấp nhận một chuỗi chứa một trong hai "tuổi" hay " tên "và trả về một đối tượng có giá trị của thuộc tính đó.

Giống như mã giả sau đây:

public object GetVal(string propName) 
    { 
     return <propName>.value; 
    } 

Làm thế nào tôi có thể làm được điều này phản ánh sử dụng?

tôi mã hóa sử dụng asp.net 3.5, C# 3.5

+3

Tự hỏi xem liệu truy cập được nhập mạnh mẽ có phải là tùy chọn tốt hơn không. Hầu hết thời gian này là trường hợp. – ChaosPandion

+1

Lưu ý rằng lớp bạn đã hiển thị không * có * bất kỳ thuộc tính nào. Nó có hai trường. Có sự khác biệt lớn giữa các trường và thuộc tính - bạn thực sự quan tâm đến điều gì? –

+0

@ChaosPandion: Bạn có ý nghĩa gì khi truy cập mạnh mẽ? switch (propname) {}? – TheMoot

Trả lời

14

Tôi nghĩ rằng đây là cú pháp thích hợp ...

var myPropInfo = myType.GetProperty("MyProperty"); 
var myValue = myPropInfo.GetValue(myInstance, null); 
+0

Tôi không có đặc quyền chỉnh sửa, nhưng dòng thứ hai của bạn var myValue = propertyInfo.GetValue (myInstance, null); nên nói myproperty.Info vv Và cảm ơn, sau đó nó làm việc. – TheMoot

+1

Cảm ơn ... Tôi đã chỉnh sửa và sửa tên biến. – Todd

4

Trước hết, ví dụ bạn cung cấp không có người Properties. Nó có các biến thành viên riêng. Đối với tài sản, bạn sẽ có một cái gì đó như:

public class Person 
{ 
    public int Age { get; private set; } 
    public string Name { get; private set; } 

    public Person(int age, string name) 
    { 
     Age = age; 
     Name = name; 
    } 
} 

Và sau đó sử dụng phản ánh để có được các giá trị:

public object GetVal(string propName) 
{ 
    var type = this.GetType(); 
    var propInfo = type.GetProperty(propName, BindingFlags.Instance); 
    if(propInfo == null) 
     throw new ArgumentException(String.Format(
      "{0} is not a valid property of type: {1}", 
      propName, 
      type.FullName)); 

    return propInfo.GetValue(this); 
} 

Hãy ghi nhớ, tuy nhiên, rằng kể từ khi bạn đã có thể tiếp cận cho lớp và các thuộc tính của nó (vì bạn cũng có quyền truy cập vào phương thức), nó dễ dàng hơn nhiều chỉ để sử dụng các thuộc tính hơn là làm một cái gì đó lạ mắt thông qua Reflection.

+0

xin lỗi , jon đã chỉ ra điều này. Tôi đã chỉnh sửa ví dụ của mình. Tôi đã dummied xuống ví dụ này một chút quá xa. – TheMoot

+0

Mã mẫu giả định rằng một thuộc tính bị thiếu và một thuộc tính có giá trị 'null' là tương đương. Bạn có thể muốn ném một 'ArgumentException' nếu' propName' đã cho không ánh xạ tới một thuộc tính. –

2

Bạn có thể làm một cái gì đó như thế này:

Person p = new Person(10, "test"); 

IEnumerable<FieldInfo> fields = typeof(Person).GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

string name = (string) fields.Single(f => f.Name.Equals("name")).GetValue(p); 
int age = (int) fields.Single(f => f.Name.Equals("age")).GetValue(p); 

Hãy ghi nhớ vì đây là những ví dụ riêng lĩnh vực mà bạn cần nêu rõ các cờ ràng buộc để có được chúng thông qua sự phản chiếu.

Edit:

Có vẻ như bạn đã thay đổi mẫu của bạn từ việc sử dụng các lĩnh vực để tính, vì vậy tôi chỉ cần đi để lại điều này ở đây trong trường hợp bạn thay đổi lại một lần nữa. :)

+0

Tôi đã chỉnh sửa ví dụ của mình vì tôi đã lẩn tránh xuống một chút quá xa. Nhưng câu trả lời của bạn có thể hữu ích cho các lĩnh vực vì vậy cảm ơn, và tôi sẽ bỏ phiếu cho bạn. – TheMoot

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