2010-09-18 25 views
80

Trong C# 3.0 bạn có thể tạo lớp vô danh với cú pháp sauLàm thế nào để năng động lớp vô danh mới?

var o1 = new { Id = 1, Name = "Foo" }; 

Có cách nào để động tạo ra những lớp vô danh với một biến?


Ví dụ:

var o1 = new { Id = 1, Name = "Foo" }; 
var o2 = new { SQ = 2, Birth = DateTime.Now }; 

động tạo Ví dụ:

var o1 = DynamicNewAnonymous(new NameValuePair("Id", 1), new NameValuePair("Name", "Foo")); 
var o2 = DynamicNewAnonymous(new NameValuePair("SQ", 2), new NameValuePair("Birth", 
DateTime.Now)); 

bởi vì tôi cần phải làm:

dynamic o1 = new ExpandObject(); 
o1."ID" = 1; <--"ID" is dynamic name 
o1."Name" = "Foo"; <--"Name" is dynamic name 

Và Scene 1:

void ShowPropertiesValue(object o) 
{ 
    Type oType = o.GetType(); 
    foreach(var pi in oType.GetProperties()) 
    { 
    Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); 
    } 
} 

nếu tôi gọi:

dynamic o1 = new ExpandObject(); 
o1.Name = "123"; 
ShowPropertiesValue(o1); 

Nó không thể hiển thị kết quả:

Name = 123 

Và tôi cũng làm thế nào để Chuyển đổi ExpandoObject để AnonymouseType?

Type type = o1.GetType(); 
type.GetProperties(); <--I hope it can get all property of o1 

ngoái, tôi thay đổi phương pháp ShowPropertiesValue()

void ShowPropertiesValue(object o) 
{ 
    if(o is static object) <--How to check it is dynamic or static object? 
    { 
    Type oType = o.GetType(); 
    foreach(var pi in oType.GetProperties()) 
    { 
     Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); 
    } 
    } 
    else if(o is dynamic object) <--How to check it is dynamic or static object? 
    { 
    foreach(var pi in ???) <--How to get common dynamic object's properties info ? 
    { 
     Console.WriteLine("{0}={1}", pi.Name, pi.GetValue(o, null)); 
    } 
    } 
} 

Làm thế nào để thực hiện phương pháp DynamicNewAnonymous hoặc làm thế nào để thay đổi ShowPropertiesValue()?

động cơ của tôi là:

dynamic o1 = new MyDynamic(); 
o1.Name = "abc"; 
Type o1Type = o1.GetType(); 
var props = o1Type.GetProperties(); <--I hope can get the Name Property 

Nếu tôi có thể treo GetType Phương pháp dynamicObject, và bắt buộc chuyển đổi để mạnh mẽ-gõ Loại. Mã liền mạch ở trên có thể hoạt động tốt.

+0

@Vlad: Tôi thừa nhận tôi có chút không rõ ràng về động cơ. –

+0

@VladLazarenko Tôi nghĩ bạn đúng :-) – oberfreak

+0

Hãy cho chúng tôi biết, bạn muốn làm gì và tại sao đây là giải pháp bạn đã chọn. – oberfreak

Trả lời

61

Loại ẩn danh chỉ là các loại thông thường được khai báo hoàn toàn. Họ có ít việc phải làm với dynamic.

Bây giờ, nếu bạn sử dụng một số ExpandoObject và tham chiếu nó thông qua biến số dynamic, bạn có thể thêm hoặc xóa trường khi đang di chuyển.

chỉnh sửa

Chắc chắn bạn có thể: chỉ cần bỏ nó vào IDictionary<string, object>. Sau đó, bạn có thể sử dụng chỉ mục.

Bạn sử dụng các kỹ thuật đúc cùng để lặp qua các lĩnh vực:

dynamic employee = new ExpandoObject(); 
employee.Name = "John Smith"; 
employee.Age = 33; 

foreach (var property in (IDictionary<string, object>)employee) 
{ 
    Console.WriteLine(property.Key + ": " + property.Value); 
} 
// This code example produces the following output: 
// Name: John Smith 
// Age: 33 

Đoạn mã trên và nhiều hơn nữa có thể được tìm thấy bằng cách nhấp vào liên kết đó.

+1

Nhưng ExpandoObject không thể làm điều đó: 'dynamic o1 = new ExpandObject(); o1. "ID" = 1; o1. "Name" = "Foo"; ' – Flash

+0

Nhưng nó cũng không thể làm: Loại o1Type = o1.GetType(); var props = o1Type.GetProperties(); props are empty – Flash

+1

Tất cả những gì bạn đang làm là nói rằng các thuộc tính động không giống với các thuộc tính được gõ mạnh. Đây là sự thật. –

5

Bạn có thể tạo một ExpandoObject như thế này:

IDictionary<string,object> expando = new ExpandoObject(); 
expando["Name"] = value; 

Và sau khi đúc nó để năng động, những giá trị này sẽ trông giống như thuộc tính:

dynamic d = expando; 
Console.WriteLine(d.Name); 

Tuy nhiên, họ không phải là tính chất thực tế và không thể được truy cập bằng cách sử dụng Reflection. Vì vậy, câu lệnh sau sẽ trả lại một giá trị rỗng:

d.GetType().GetProperty("Name") 
Các vấn đề liên quan