Không phải rất dễ dàng, không. Phản ánh không hoạt động vì nó giả định kiểu mô hình thông thường, là không phải là phạm vi đầy đủ của dynamic
. Nếu bạn đang thực sự chỉ nói chuyện với các đối tượng thông thường, thì chỉ cần sử dụng sự phản chiếu ở đây. Nếu không, tôi hy vọng bạn có thể muốn đảo ngược kỹ sư mã mà trình biên dịch phát ra cho một nhiệm vụ cơ bản và tinh chỉnh nó để có một tên thành viên linh hoạt. Tôi sẽ thành thật, mặc dù: đây không phải là một lựa chọn hấp dẫn; một đơn giản:
dynamic foo = ...
foo.Bar = "abc";
dịch để:
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "Bar", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));
}
<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, foo, "abc");
Nếu bạn muốn một phương pháp mà làm việc cho cả hai đối tượng năng động và không động: FastMember rất thuận tiện cho việc này, và làm việc tại một trong hai loại hoặc cấp đối tượng:
// could be static or DLR
var wrapped = ObjectAccessor.Create(obj);
string propName = // something known only at runtime
Console.WriteLine(wrapped[propName]);
có sẵn trên Nuget và được tối ưu hóa nhiều cho cả động và không động enarios.
Nguồn
2010-06-13 18:39:00
Phản ánh có lẽ là giải pháp của riêng bạn, trừ khi bạn đặt các thuộc tính của mình thành một bản đồ băm để chúng có thể được xác định khi chạy. –
có thể trùng lặp của các thuộc tính [Thêm không xác định (tại thời điểm thiết kế) vào một ExpandoObject] (http://stackoverflow.com/questions/2974008/adding-unknown-at-design-time-properties-to-an-expandoobject) – nawfal