Là một lớp thực thể, tôi muốn thêm một thuộc tính vào thời gian chạy, tôi nên làm như thế nào?C#: Làm thế nào để thêm một thuộc tính vào một đối tượng tại thời gian chạy?
Trả lời
Chỉnh sửa: vui lòng làm rõ, bạn đang nói về c# attributes hoặc các thành viên trong lớp học của bạn?
Cách duy nhất bạn có thể thêm thuộc tính C# là tạo một lớp hoàn toàn mới với các thuộc tính bổ sung, biên dịch và tải assembly mới vào AppDomain hiện tại của bạn.
Sử dụng thẻ bắt buộc để lưu trữ thuộc tính của bạn.
Nếu bạn muốn linh hoạt thời gian chạy nhiều hơn, bạn có thể thử Ruby hoặc một số ngôn ngữ thông dịch khác.
s/diễn giải/động /. Ruby, PHP và Python là năng động. C#, Java và VB là tĩnh. – strager
@bill Tôi nghĩ bạn có nghĩa là ngôn ngữ động ... –
Chắc chắn - điểm tốt. Bất kỳ ngôn ngữ có thể được biên soạn, và bất kỳ ngôn ngữ có thể được giải thích. Chỉ là một sự trùng hợp kỳ lạ mà Ruby, PHP và Python thường được giải thích và C#, Java và VB được biên dịch ... –
Thuộc tính là một phần của siêu dữ liệu của một loại và do đó chúng được mã hóa cứng trong hội đồng được biên dịch (đó cũng là lý do tại sao bạn chỉ được phép sử dụng một số kiểu nguyên thủy và không tùy ý dữ liệu tại thuộc tính).
Hậu quả là bạn không thể thêm bất kỳ thuộc tính nào vào loại khi chạy. Nhưng có nhiều kỹ thuật thay thế khác nhau. Bạn có thể sử dụng từ điển đơn giản hoặc thứ gì đó mạnh hơn như attached dependency properties.
Hãy xem Thời gian chạy ngôn ngữ động. Bạn cũng có thể xem xét một ngôn ngữ động như IronRuby hoặc IronPython.
Bạn đang cố gắng giải phẫu bằng chứng nào?
Điều gì cần xem thuộc tính? Nếu đó là những thứ như liên kết dữ liệu vv, TypeDescriptor
nên làm việc:
TypeDescriptor.AddAttributes(type, attribs);
TypeDescriptor.AddAttributes(instance, attribs);
này chỉ ảnh hưởng System.ComponentModel
sử dụng (phản xạ không trực tiếp), nhưng đó thường là đủ - ví dụ, bạn có thể kết hợp một TypeConverter
qua ở trên.
Nếu theo "thuộc tính", bạn có nghĩa là "thuộc tính", thì (một lần nữa, theo như ràng buộc dữ liệu có liên quan) TypeDescriptor
cũng có tiềm năng ở đó - nhưng nó không tầm thường; bạn cần phải thực hiện ICustomTypeDescriptor
trên đối tượng hoặc viết CustomTypeDescriptor
cho loại - và trong cả hai trường hợp, bạn cần phải viết thực hiện PropertyDescriptor
của riêng bạn (thường nói chuyện với từng từ điển cụ thể, v.v.). Điều này sẽ được sử dụng bởi bất kỳ nội dung nào sử dụng:
// only works if you use TypeDescriptionProvider
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type);
// works via TypeDescriptionProvider or ICustomTypeDescriptor
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj);
Một lần nữa, điều này bao gồm một loạt các trường hợp ràng buộc dữ liệu và tương tự. Ví dụ về điều này, see here - nó là xa tầm thường, tuy nhiên. Các ví dụ sử dụng (từ liên kết) thêm hai thuộc tính trong thời gian chạy:
Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5));
Bag.AddProperty<string>("Name");
tôi sẽ đi với PostSharp, rất thanh lịch AOP framework (hoặc Policy tiêm).
PostSharp allows you to inject custom attributes.
Mục nhập blog được đề cập trong bài đăng có một số mã bạn có thể tải xuống để đạt được mục tiêu của mình.
bài này trả lời này cho tôi:
- 1. Làm cách nào để thêm thuộc tính vào đối tượng trong thời gian chạy?
- 2. Tự động thêm thuộc tính C# tại thời gian chạy
- 3. Làm cách nào để thêm thuộc tính vào lớp trong thời gian chạy trong C#?
- 4. Lặp qua tất cả các thuộc tính đối tượng tại thời gian chạy
- 5. Khuôn khổ thực thể: Thêm thuộc tính/đối tượng trong thời gian chạy
- 6. javascript thêm một phút vào đối tượng thời gian
- 7. Làm cách nào để thêm lề vào một Nút tại thời gian chạy?
- 8. Thêm các thông tin thêm thời gian chạy vào đối tượng activerecord
- 9. Thêm phút vào đối tượng Thời gian
- 10. Java - Thuộc tính: Thêm khóa mới vào tệp thuộc tính trong thời gian chạy?
- 11. Làm thế nào tôi có thể theo dõi một biến tại thời gian chạy trong C#?
- 12. Làm thế nào để tiêm IL vào một phương pháp tại thời gian chạy
- 13. Thêm thành viên vào đối tượng động trong thời gian chạy
- 14. Kích thước của một đối tượng trong thời gian chạy
- 15. Làm thế nào để jQuery làm cho đối tượng jQuery cả một hàm và một thuộc tính đối tượng?
- 16. Tự động thêm thuộc tính vào đối tượng động?
- 17. Thay đổi thuộc tính log4j tại thời gian chạy
- 18. Mục tiêu-C: Làm thế nào để thay đổi lớp của một đối tượng trong thời gian chạy?
- 19. Làm thế nào để vượt qua các đối tượng vào một nhà xây dựng thuộc tính
- 20. Làm thế nào để thêm thuộc tính vào nút Nokogiri?
- 21. Thuộc tính động Objective-C trong thời gian chạy?
- 22. Làm cách nào để tạo một tệp Win32 DLL mà không phụ thuộc vào thời gian chạy C
- 23. làm thế nào để tạo ra một lớp năng động tại thời gian chạy trong Java
- 24. Thêm thời gian vào đối tượng POSIXct trong R
- 25. Thêm các lọ vào một trình cắm thêm Eclipse tại thời gian chạy
- 26. Làm cách nào để ngăn jQuery chèn các thuộc tính 'xmlns' vào một đối tượng XML?
- 27. Làm thế nào để chuyển đổi từ một chuỗi thành tên thuộc tính đối tượng?
- 28. Làm thế nào để tôi mongoexport thuộc tính từ một mảng các đối tượng để CSV?
- 29. Thêm nhiều thuộc tính vào một đối tượng js hiện có
- 30. Thêm chú thích Java tại thời gian chạy
Và bởi lớp, anh có nghĩa là một loại hoàn toàn mới, không chỉ là một thể hiện của cùng một lớp. –
@ Jelel khá đúng, tôi có thể thấy nó có thể hơi mơ hồ. Cảm ơn –