2012-12-07 9 views
14

Vấn đề tôi đang cố giải quyết là cách viết một phương thức nhận tên thuộc tính dưới dạng chuỗi và trả về giá trị được gán cho thuộc tính đã nói.C# truy cập các giá trị thuộc tính động theo tên thuộc tính

lớp Mô hình của tôi được khai báo tương tự như:

public class Foo 
{ 
    public int FooId 
    public int param1 
    public double param2 
} 

và từ bên trong phương pháp của tôi, tôi muốn làm một cái gì đó tương tự như sau

var property = GetProperty("param1) 
var property2 = GetProperty("param2") 

Tôi hiện đang cố gắng để làm điều này bằng cách sử dụng biểu thức như vậy như

public dynamic GetProperty(string _propertyName) 
    { 
     var currentVariables = m_context.Foo.OrderByDescending(x => x.FooId).FirstOrDefault(); 

     var parameter = Expression.Parameter(typeof(Foo), "Foo"); 
     var property = Expression.Property(parameter, _propertyName); 

     var lambda = Expression.Lambda<Func<GlobalVariableSet, bool>>(parameter); 

    } 

Cách tiếp cận này có đúng không, và nếu có, có thể trả lại thứ là một loại động?

Câu trả lời là chính xác, đã khiến việc này trở nên quá phức tạp. Giải pháp bây giờ là:

public dynamic GetProperty(string _propertyName) 
{ 
    var currentVariables = m_context.Foo.OrderByDescending(g => g.FooId).FirstOrDefault(); 

    return currentVariables.GetType().GetProperty(_propertyName).GetValue(currentVariables, null); 
} 
+0

Bạn có thể sử dụng System.Reflection.PropertyInfo để tra cứu giá trị của thuộc tính từ một loại cụ thể. http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx – Chris

Trả lời

26
public static object ReflectPropertyValue(object source, string property) 
{ 
    return source.GetType().GetProperty(property).GetValue(source, null); 
} 
+0

Tôi nghĩ rằng điều này sẽ ném một ngoại lệ cho các thuộc tính có trình chỉ mục. –

6

Bạn đang đi theo cách quá nhiệt tình với các mẫu mà bạn cung cấp.

Phương pháp bạn đang tìm kiếm:

public static object GetPropValue(object target, string propName) 
{ 
    return target.GetType().GetProperty(propName).GetValue(target, null); 
} 

Nhưng sử dụng "var" và "năng động" và "Biểu hiện" và "Lambda" ... bạn đang bị ràng buộc để bị lạc trong mã này 6 vài tháng kể từ bây giờ. Chú ý đến các cách viết đơn giản hơn