2012-02-09 37 views
35

Bây giờ một lần nữa tôi giải thích một trong những háo hức của tôi về từ điển! Câu hỏi này được bật lên trong tâm trí của tôi từ câu trả lời của previous question !!Làm thế nào để chuyển đổi lớp thành Dictionary <string, string>?

Bây giờ điểm thực tế là Tôi có thể chuyển đổi Lớp học thành Từ điển không?

Trong từ điển Tôi muốn thuộc tính của lớp tôi như KEY giá trị và tài sản cụ thể như GIÁ TRỊ

Giả sử lớp học của tôi là

public class Location 
{ 
    public string city { get; set; } 
    public string state { get; set; } 
    public string country { get; set; 
} 

Bây giờ giả sử dữ liệu của tôi là

city = Delhi 
state = Delhi 
country = India 

Bây giờ bạn có thể hiểu điểm của tôi một cách dễ dàng!

Tôi muốn tạo từ điển! Từ điển đó phải giống như

Tôi có thể nhận được giá trị! Nhưng làm cách nào tôi có thể nhận được tên thuộc tính (không có giá trị)?

Tôi nên viết mã gì để tạo quảng cáo động! Điều đó sẽ làm việc cho mọi lớp mà tôi muốn?

Bạn có thể hiểu câu hỏi này như

Làm thế nào tôi có thể nhận được danh sách các thuộc tính từ lớp học đặc biệt?

+0

Bạn có thể thử viết lại câu hỏi không? Tôi không có ý tưởng thực sự những gì bạn đang cố gắng đạt được. – ilivewithian

+0

Insort! Tôi muốn tất cả các biến của tên của lớp học cụ thể! Điều này có thể không? – Chintan

+0

@NoOne Tôi đã trả lời bạn, nhưng bạn cần tìm hiểu thêm về OOP.Bạn đang nói về _properties_. Và "các biến" cấp lớp được gọi là _fields_. Điều quan trọng là phải gọi mọi thứ bằng tên của nó như là sự hiểu biết bạn sẽ dễ dàng hơn bây giờ! ;) –

Trả lời

88

Đây là công thức: 1 phản ánh, 1 LINQ-to-Objects!

someObject.GetType() 
    .GetProperties(BindingFlags.Instance | BindingFlags.Public) 
      .ToDictionary(prop => prop.Name, prop => prop.GetValue(someObject, null)) 

Vì tôi đã xuất bản câu trả lời này, tôi đã kiểm tra rằng nhiều người thấy hữu ích. Tôi mời tất cả mọi người tìm kiếm giải pháp đơn giản này để kiểm tra một Q & Một nơi tôi đã tổng quát nó thành một phương pháp mở rộng: Mapping object to dictionary and vice versa.

+0

Nếu tôi thấy các thuộc tính "nội tại" như "GenericEqualityComparer", thay vì các thuộc tính mà tôi đã khai báo rõ ràng thì sao? Tôi đã thử 'BindingFlags.DeclaredOnly'. – drzaus

+0

** CẬP NHẬT ** nevermind - Tôi thấy rằng phương pháp sử dụng sự phản chiếu này (chính nó trong một phần mở rộng đối tượng) đã kết thúc tự gọi với kết quả được chuyển đổi, vì vậy phần mở rộng của tôi đã được gọi trên một đối tượng AND THEN trên từ điển kết quả. – drzaus

+0

Tôi không thể biên dịch này trong Unity3D, tôi thiếu một tham chiếu lắp ráp? – c0d3Junk13

13

Dưới đây là một ví dụ với suy nghĩ mà không LINQ:

Location local = new Location(); 
    local.city = "Lisbon"; 
    local.country = "Portugal"; 
    local.state = "None"; 

    PropertyInfo[] infos = local.GetType().GetProperties(); 

    Dictionary<string,string> dix = new Dictionary<string,string>(); 

    foreach (PropertyInfo info in infos) 
    { 
     dix.Add(info.Name, info.GetValue(local, null).ToString()); 
    } 

    foreach (string key in dix.Keys) 
    { 
     Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]); 
    } 

    Console.Read(); 
+0

Điều này đã tiết kiệm cho tôi ít nhất một ngày làm việc. Cảm ơn rất nhiều, tôi sẽ bầu bạn gấp đôi nếu tôi có thể! – Kibitz503

0
protected string getExamTimeBlock(object dataItem) 
{ 
    var dt = ((System.Collections.Specialized.StringDictionary)(dataItem)); 

    if (SPContext.Current.Web.CurrencyLocaleID == 1033) return dt["en"]; 
    else return dt["sv"]; 
} 
0

này cung cấp cho một thử.

public static Dictionary<string, object> ObjectToDictionary(object obj) 
    { 
     Dictionary<string, object> ret = new Dictionary<string, object>(); 

     foreach (PropertyInfo prop in obj.GetType().GetProperties()) 
     { 
      string propName = prop.Name; 
      var val = obj.GetType().GetProperty(propName).GetValue(obj, null); 
      if (val != null) 
      { 
       ret.Add(propName, val.ToString()); 
      } 
      else 
      { 
       ret.Add(propName, null); 
      } 
     } 

     return ret; 
    } 
0

Tôi muốn thêm thay thế cho phản chiếu, sử dụng JToken. Bạn sẽ cần phải kiểm tra sự khác biệt điểm chuẩn giữa hai để xem có hiệu suất tốt hơn.

var location = new Location() { City = "London" }; 
var locationToken = JToken.FromObject(location); 
var locationObject = locationObject.Value<JObject>(); 
var locationPropertyList = locationObject.Properties() 
    .Select(x => new KeyValuePair<string, string>(x.Name, x.Value.ToString())); 

Lưu ý phương pháp này là tốt nhất cho cấu trúc lớp phẳng.

+0

'var locationObject = locationObject.Value ();'? –

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