2009-02-19 34 views

Trả lời

2

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.

+0

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. –

+0

@ Jelel khá đúng, tôi có thể thấy nó có thể hơi mơ hồ. Cảm ơn –

1

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.

+0

s/diễn giải/động /. Ruby, PHP và Python là năng động. C#, Java và VB là tĩnh. – strager

+0

@bill Tôi nghĩ bạn có nghĩa là ngôn ngữ động ... –

+0

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 ... –

0

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.

9

Đ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"); 
Các vấn đề liên quan