2009-09-19 75 views
37

Giả sử tôi có nhiều đối tượng và chúng có nhiều thuộc tính chuỗi.Đếm số thuộc tính (chuỗi) của đối tượng trong C#

Có cách nào lập trình để đi qua chúng và xuất ra tên thuộc tính và giá trị của nó hoặc nó có phải được mã hóa cứng không?

Có cách nào LINQ truy vấn thuộc tính của đối tượng thuộc loại 'chuỗi' và xuất chúng không?

Bạn có phải viết mã cứng tên thuộc tính bạn muốn lặp lại không?

Trả lời

70

Sử dụng phản chiếu. Đó là hư không gần như nhanh như truy cập tài sản hardcoded, nhưng nó làm những gì bạn muốn.

Các truy vấn sau đây tạo ra một loại vô danh với Tên và giá trị thuộc tính cho mỗi tài sản chuỗi gõ vào các đối tượng 'myObject':

var stringPropertyNamesAndValues = myObject.GetType() 
    .GetProperties() 
    .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null) 
    .Select(pi => new 
    { 
     Name = pi.Name, 
     Value = pi.GetGetMethod().Invoke(myObject, null) 
    }); 

Cách sử dụng:

foreach (var pair in stringPropertyNamesAndValues) 
{ 
    Console.WriteLine("Name: {0}", pair.Name); 
    Console.WriteLine("Value: {0}", pair.Value); 
} 
+2

Thay vì pi.GetGetMethod(). Gọi (myObject, null) Tôi muốn sử dụng pi.GetValue (myObject, null) - đơn giản hơn để đọc. – Sam

3

Bạn có thể dùng phản ánh để làm cái này... . có một bài viết phong nha tại CodeGuru, nhưng điều đó có thể nhiều hơn bạn đang tìm kiếm ... bạn có thể học hỏi từ nó, và sau đó cắt nó theo nhu cầu của bạn.

-2

Làm thế nào về một cái gì đó như thế này?

public string Prop1 
{ 
    get { return dic["Prop1"]; } 
    set { dic["Prop1"] = value; } 
} 

public string Prop2 
{ 
    get { return dic["Prop2"]; } 
    set { dic["Prop2"] = value; } 
} 

private Dictionary<string, string> dic = new Dictionary<string, string>(); 
public IEnumerable<KeyValuePair<string, string>> AllProps 
{ 
    get { return dic.GetEnumerator(); } 
} 
11

Bạn có thể nhận tất cả các thuộc tính của một loại bằng cách sử dụng phương pháp GetProperties. Sau đó, bạn có thể lọc danh sách này bằng phương pháp mở rộng LINQ Where. Cuối cùng, bạn có thể chiếu các thuộc tính bằng cách sử dụng phương thức mở rộng LINQ Select hoặc phím tắt tiện lợi như ToDictionary.

Nếu bạn muốn giới hạn liệt kê để tính có kiểu String bạn có thể sử dụng mã này:

IDictionary<String, String> = myObject.GetType() 
    .GetProperties() 
    .Where(p => p.CanRead && p.PropertyType == typeof(String)) 
    .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null)); 

này sẽ tạo ra một từ điển mà các bản đồ tên tài sản cho giá trị bất động sản. Vì loại thuộc tính được giới hạn ở String, nên an toàn khi truyền giá trị thuộc tính đến String và loại của loại trả lại là IDictionary<String, String>.

Nếu bạn thay vì muốn tất cả các thuộc tính bạn có thể làm điều đó như thế này:

IDictionary<String, Object> = myObject.GetType() 
    .GetProperties() 
    .Where(p => p.CanRead) 
    .ToDictionary(p => p.Name, p => p.GetValue(myObject, null)); 
3

Nếu mục tiêu của bạn chỉ đơn giản là để sản xuất các dữ liệu lưu trữ trong thuộc tính của đối tượng sử dụng một định dạng con người có thể đọc được, tôi thích chỉ đơn giản là serialize đối tượng vào định dạng JSON.

using System.Web.Script.Serialization; 
//... 

string output = new JavaScriptSerializer().Serialize(myObject); 
Các vấn đề liên quan