Trong C#/.NET thông thường, câu trả lời là "không" đơn giản. Nhất bạn có thể làm là viết DynamicMethod
có thể hành xử như một phương thức thuộc loại đó (truy cập vào các trường riêng tư v.v.), nhưng nó sẽ không bao giờ có trên API - bạn chỉ cần kết thúc với một đại biểu.
Nếu bạn sử dụng dynamic
, bạn có thể thực hiện khá nhiều thứ mình muốn. Bạn có thể mô phỏng điều đó với ExpandoObject
bằng cách đính kèm đại biểu thay cho phương pháp, nhưng trên loại động tùy chỉnh, bạn có thể thực hiện mọi thứ - nhưng điều này chỉ ảnh hưởng đến người gọi sử dụng API dynamic
. Đối với một cơ bản ExpandoObject
dụ:
dynamic obj = new ExpandoObject();
Func<int, int> func = x => 2*x;
obj.Foo = func;
int i = obj.Foo(123); // now you see it
obj.Foo = null; // now you don't
cho thuộc tính và các sự kiện (không phương pháp), bạn có thể sử dụng phương pháp System.ComponentModel
để thay đổi những gì xuất hiện trong thời gian chạy, nhưng điều đó chỉ tác động đến những người gọi người có thể truy cập thông qua System.ComponentModel
, có nghĩa là chủ yếu là: ràng buộc dữ liệu UI. Đây là cách DataTable
đại diện cho các cột dưới dạng thuộc tính giả (quên về "tập dữ liệu đã nhập" cho thời điểm này - nó hoạt động mà không có các thuộc tính đó).
Để hoàn thành, tôi cũng nên đề cập đến phương thức mở rộng. Đó là một thủ thuật biên dịch, không phải là một thủ thuật thời gian chạy - nhưng kinda cho phép bạn thêm các phương thức vào một kiểu hiện có - cho các giá trị nhỏ của "thêm".
Một mẹo cuối cùng, thường được sử dụng bởi ORM, vv - là động phân lớp loại và cung cấp chức năng bổ sung trong lớp con. Ví dụ: ghi đè thuộc tính để chặn chúng (tải chậm, v.v.).
Nguồn
2012-06-22 18:33:19
Đây là ví dụ hoàn hảo về lý do tại sao các câu hỏi SO chỉ chứa một câu hỏi cho mỗi bài đăng. Marc và Henk từng trả lời một câu hỏi riêng mà bạn hỏi, và cả hai đều là câu trả lời đúng, đúng. Bạn chọn cái nào dưới dạng ** quyền ** và chấp nhận? Hãy giới hạn bản thân cho một câu hỏi ** ** duy nhất trên mỗi bài đăng để tránh tình huống này, nơi một trong những người trả lời nhận được phần thưởng và người kia thì không, mặc dù cả hai câu trả lời đều tốt, chính xác và trả lời câu hỏi của bạn. –
Ok. Tôi sẽ cố nhớ điều đó trong tương lai. nguyên tắc một mục đích cho các câu hỏi thay vì các phương thức/đối tượng.Bây giờ hành động đó đã được thực hiện mặc dù, tôi có lẽ không nên thay đổi nó. – user420667