Có cách nào để thêm Field
(hoặc FieldInfo
, có thể điều này giống nhau) vào một lớp lúc chạy không?Làm cách nào để tự động thêm trường vào một lớp trong C#
Trả lời
Bạn không thể thay đổi định nghĩa lớp khi chạy. Tuy nhiên, bạn có thể tạo một lớp mới kế thừa từ lớp gốc (nếu nó không phải là sealed
) và khai báo trường đó. Bạn có thể làm điều này bằng cách phát ra mã IL thích hợp bằng cách sử dụng System.Reflection.Emit
.
Không, C# không cho phép monkey-patching.
Bạn có thể tạo các lớp mới sử dụng CodeDOM hoặc Reflection.Emit, nhưng bạn không thể sửa đổi các lớp hiện có.
Nó được gọi là khỉ vá? Từ đó bắt nguồn từ đâu? –
Không biết nó xuất phát từ đâu, nhưng tôi đã thêm một liên kết đến mục nhập Wikipedia. –
Khỉ vá là một thuật ngữ đến từ Ruby. Jeff Atwood đã viết về nó trong một bài đăng blog một vài năm trước đây. –
Không chính xác.
Tuy nhiên, bạn có thể triển khai ICustomTypeDescriptor để ước tính nó, và sau đó chỉ cần sử dụng một hashtable để lưu trữ cặp tên/giá trị. Rất nhiều khuôn khổ trong đó sử dụng phản ánh yêu cầu ICustomTypeDescriptor đầu tiên.
Cảm ơn, tôi đã thử phương pháp này, nhưng nó không hoạt động đối với tôi. Tôi đang cố gắng để impelment giao diện IExpando để cho phép javascript mã gọi các lĩnh vực không tồn tại trong lớp C# của tôi. Ví dụ: var o = ActiveXObject mới ('mCom'); o.ArbitraryField = "Foo"; Xin lưu ý rằng ArbitraryField không tồn tại ở lớp của tôi. –
Bạn vừa thử triển khai IReflect chưa? Đó là cách để thực hiện IDispatch/IExpando cho interop với các ngôn ngữ động (ít nhất là trước khi C# 4.0). http://msdn.microsoft.com/en-us/library/system.reflection.ireflect.aspx Tôi đã thực hiện điều này chính xác với một triển khai có thể bắt đầu và nó hoạt động tốt – codekaizen
Không cho đến khi C# 4.0 bổ sung tra cứu động và dựa trên CLR 4.0 kết hợp DLR, sau đó nó sẽ không được thêm vào lớp, vì lớp sẽ không có trong hình.
Tôi sẽ không nghĩ rằng điều này sẽ có thể trong C# 4.0. Tôi nghĩ rằng bạn sẽ không thể thay đổi các loại hiện có. Tuy nhiên, tôi có thể tưởng tượng rằng bạn có thể tạo một số đối tượng động (ví dụ: đến từ Ruby) và thay đổi nó. –
Đó là những gì tôi có nghĩa là "không nghiêm chỉnh được thêm vào một lớp học, như các lớp học sẽ không có trong hình". Thay vào đó, các đối tượng riêng lẻ được tham chiếu bởi 'động' sẽ có thể chấp nhận gán cho thuộc tính không tồn tại trước đó và xử lý việc này bằng cách thêm động một thuộc tính. –
C# không cho phép điều đó vì tất cả các lớp của nó đều dựa trên Siêu dữ liệu. CLR (không phải C#) không cho phép thêm trường vào siêu dữ liệu khi chạy (1). Đây là cách duy nhất để C# có thể thêm một trường tại runitme.
Điều này không giống như các ngôn ngữ động như IronPython mà về cơ bản không có lớp siêu dữ liệu cụ thể. Chúng có nhiều cấu trúc động hơn có thể được thay đổi khi chạy. Tôi tin rằng IronPython chỉ đơn giản là giữ cho các thành viên của nó (các trường và các phương thức) với số tiền mà một hashtable có thể dễ dàng bị thay đổi khi chạy.
Trong C# 3.0, tài nguyên tốt nhất của bạn là sử dụng Reflection.Emit. Nhưng điều này sẽ tạo ra một lớp hoàn toàn mới so với việc thay đổi một lớp hiện có.
(1) Có một số API nhất định chẳng hạn như API lược tả hoặc ENC cho phép điều này nhưng tôi không chắc liệu capabalities của họ có mở rộng để thêm trường hay không.
như những người khác đã nói, điều này là không thể. Lý do cho câu hỏi của bạn là gì? Nếu bạn cần lưu trữ một số dữ liệu bổ sung trong lớp tự động, sau đó bạn có thể có thể chỉ cần sử dụng từ điển:
class My {
Dictionary<string, object> data;
public My() { data = new Dictionary<string, object>(); }
}
.. nhưng nó thực sự phụ thuộc vào những gì bạn thực sự muốn đạt được?
Mục tiêu của tôi là triển khai giao diện IExpando. Mục tiêu siêu của tôi là cho phép mã javascript thêm các trường vào đối tượng ActiveX động và theo "cách javascript". Ví dụ: var myobj = new ActiveXObject ('server.object'); myobj.ArbitraryField = "một cái gì đó"; Xin lưu ý rằng taht ArbirtaryField không tồn tại –
Xem this question để biết cách thực hiện đơn giản trong C# 4.0, bằng cách đúc ExpandoObject
làm IDictionary
, làm cho giá trị được thêm vào từ điển trở thành thuộc tính của đối tượng. Tôi chứng minh điều này trong another answer of mine cho thấy rằng họ thực sự trở thành tài sản.
Tuy nhiên, điều này chỉ có thể xảy ra với phiên bản ExpandoObject
hoặc theo phân lớp DynamicObject
.
Cũng có thể sử dụng với các lớp khác nếu chúng triển khai IDynamicMetaObjectProvider
, nhưng tôi nghĩ có quá nhiều công việc liên quan để làm cho nó hoạt động bình thường.
Có lẽ bạn có thể sử dụng mẫu Decorator.
Trong lập trình hướng đối tượng, mẫu trang trí là mẫu thiết kế cho phép hành vi được thêm vào một đối tượng riêng lẻ, tĩnh hoặc động, mà không ảnh hưởng đến hành vi của các đối tượng khác từ cùng một lớp.
- 1. Làm cách nào để tự động thêm trường nhập vào biểu mẫu?
- 2. Làm cách nào để tự động thêm RowDefinition vào Grid trong một ItemsPanelTemplate?
- 3. Làm cách nào để tự động thêm tệp nhập vào FormData trong Dart?
- 4. Làm cách nào để thêm thuộc tính vào lớp trong thời gian chạy trong C#?
- 5. Eclipse: Làm thế nào để tự động tạo getter khi thêm một trường?
- 6. Làm cách nào để thêm một lớp mới vào một phần tử động?
- 7. Làm cách nào để tạo một trường trong MySql tự động tăng trong PHPMyAdmin?
- 8. Làm cách nào để chuyển một tham số bổ sung vào trường Tự động điền Jquery?
- 9. Thêm trường để một lớp proxy trong Clojure
- 10. Làm cách nào để thêm trường tùy chỉnh vào InlineFormsets?
- 11. Làm cách nào để gán "tham chiếu" vào trường lớp trong C#?
- 12. Làm cách nào để điền vào các "lỗ hổng" trong các trường tự động incremenet?
- 13. Làm cách nào để thêm "lớp" vào ChoiceField ở Django?
- 14. Làm thế nào để tự động khởi tạo một lớp trong Objective-C
- 15. Làm thế nào để tự động thêm một cột mới vào một bảng HTML
- 16. Làm cách nào để thêm trường hình ảnh tùy chỉnh vào một danh mục trong Magento?
- 17. Symfony2 - FormBuilder - thêm một lớp vào trường và nhập
- 18. Cách tự động thêm phương thức lớp học?
- 19. Làm cách nào để thêm Trường khóa ngoài vào một ModelForm trong Django?
- 20. Làm cách nào để tự động thêm đối tượng SQLAlchemy vào phiên?
- 21. Làm cách nào để thêm bộ lọc tự động vào mối quan hệ với SQLAlchemy?
- 22. Python: Thêm trường vào đối tượng động
- 23. Wtforms, thêm một lớp vào biểu mẫu động
- 24. Cách thêm nhiều người nhận vào trường mailitem.cc C#
- 25. Làm cách nào để thêm một lớp css vào các hàng cụ thể trong slickGrid?
- 26. Làm cách nào để thêm phương thức với trình trang trí vào một lớp trong python?
- 27. Làm thế nào để thêm một lớp vào một hàng mới trong một datatables jquery?
- 28. Làm cách nào để thêm mô-đun vào tính năng tự động điền ipython?
- 29. Làm cách nào để thêm lớp đang hoạt động vào siêu liên kết mã hóa?
- 30. C#: Làm cách nào để thêm một chú giải công cụ vào một điều khiển?
thể trùng lặp của [Làm thế nào để tạo ra tính năng động trong C#?] (Http://stackoverflow.com/questions/947241/how-do-i-create-dynamic-properties-in-c) – nawfal