2009-07-17 31 views
9

tôi cần phải phát hiện nếu một đối tượng được tạo ra một cách ẩn danh như mới {name = value,}C# Phát hiện AnonymousType mới {name = value,} và chuyển đổi thành Dictionary <string, object>

nếu nó là một AnonymousType, nó nên thêm nó thuộc tính tên/giá trị vào một

Dictionary<string,object> 

Đây là những gì tôi bị tấn cùng bản thân mình:

var name="name"; 

var obj = new { name = new object(), }; 

var lookup = new Dictionary<string,object>(); 


if(obj.GetType().Name.StartsWith("<>f__AnonymousType")) 
{ 
    foreach (var property in obj.GetType().GetProperties()) 
    { 
     lookup[property.Name] = property.GetValue(obj, null); 
    } 
} 
else 
{ 
    lookup[name]=obj; 
} 

tôi đã tự hỏi nếu có một/cách tốt hơn nhanh hơn phát hiện AnonymousTypes, hoặc nếu có một/cách nhanh hơn để đổ tên thuộc tính của một đối tượng/giá trị vào một

Dictionary<string,object> 
+0

Bạn đang cố gắng làm gì với điều này? Dù nó là gì, phải có một cách tốt hơn để làm điều đó. –

Trả lời

24

Để có được tất cả các thuộc tính của một đối tượng, với giá trị của nó thành một Dictionary, bạn có thể kết hợp sức mạnh của LINQ với các đối tượng có phản ánh.

Bạn có thể sử dụng phương pháp Enumerable.ToDictionary:

var dic = obj.GetType() 
      .GetProperties() 
      .ToDictionary(p => p.Name, p=> p.GetValue(obj, null)); 

này sẽ đưa bạn trở một Dictionary<string, object>.

+0

Vấn đề là nếu anh ta chỉ có thể sử dụng từ điển ngay từ đầu, nó sẽ nhanh hơn rất nhiều trừ khi Linq đang làm một số bộ nhớ đệm điên trên truy vấn đó, trong trường hợp đó "chỉ" có thể đo được nhanh hơn. –

+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ử 'GetProperties (BindingFlags.DeclaredOnly)'. – drzaus

+0

lạ, 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 đối tượng AND THEN trên từ điển kết quả. – drzaus

6

Sử dụng cú pháp khởi tạo đối tượng bộ sưu tập mới thay vì một loại vô danh:

var obj = new Dictionary<string, object>() 
{ 
    { "Name", t.Name }, 
    { "Value", t.Value } 
}; 
2

Phát hiện một ẩn danh loại là ít cứng; không ít nhất nó phụ thuộc vào ngôn ngữ! Các kiểu anon VB không giống với kiểu C# anon. Tôi không rõ ràng về logic hoạt động khác nhau trên các loại anon. Bạn có thể kiểm tra [CompilerGenerated], nhưng lưu ý rằng nó không chỉ có nghĩa là "loại ẩn danh" - có những người khác làm điều này.

Cá nhân, tôi sẽ không phân biệt trong trường hợp này.

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