Có thể thêm thuộc tính khi chạy hoặc thay đổi giá trị của thuộc tính khi chạy không?
Có thể thêm thuộc tính khi chạy hoặc thay đổi giá trị của thuộc tính khi chạy không?
Câu trả lời:
Các thuộc tính là siêu dữ liệu tĩnh. Các tập hợp, mô-đun, loại, thành viên, tham số và giá trị trả về không phải là đối tượng hạng nhất trong C # (ví dụ: System.Type
lớp chỉ là một đại diện được phản ánh của một loại). Bạn có thể lấy một thể hiện của một thuộc tính cho một loại và thay đổi các thuộc tính nếu chúng có thể ghi được nhưng điều đó sẽ không ảnh hưởng đến thuộc tính vì nó được áp dụng cho loại đó.
Điều này thực sự phụ thuộc vào chính xác những gì bạn đang cố gắng thực hiện.
Công cụ System.ComponentModel.TypeDescriptor có thể được sử dụng để thêm thuộc tính cho các loại, thuộc tính và thể hiện đối tượng và nó cũng có giới hạn là bạn phải sử dụng nó để truy xuất các thuộc tính đó. Nếu bạn đang viết mã tiêu thụ các thuộc tính đó và bạn có thể sống trong những giới hạn đó, thì tôi chắc chắn sẽ đề xuất nó.
Theo như tôi biết, điều khiển PropertyGrid và bề mặt thiết kế phòng thu trực quan là những thứ duy nhất trong BCL tiêu thụ các công cụ TypeDescriptor. Trên thực tế, đó là cách họ làm khoảng một nửa những việc họ thực sự cần làm.
TypeDescriptor
và TypeDescriptionProvider
không được triển khai?
[Attr(1), Attr(2), Attr(3)]
chỉ Attr(3)
được tìm thấy.
Chà, để khác biệt, tôi đã tìm thấy một bài viết tham khảo bằng Reflection.Emit để làm như vậy.
Đây là liên kết: http://www.codeproject.com/KB/cs/dotnetattribut.aspx , bạn cũng sẽ muốn xem xét một số ý kiến ở cuối bài viết, bởi vì các phương pháp có thể được thảo luận.
YourClass
thành YourRuntimeClassWithAttributes
.
YourClass
, bạn có thể phân lớp nó trong thời gian chạy và tạo một lớp giống hệt với một tên hơi khác cũng có các thuộc tính được tạo động mong muốn và đa hình sẽ cho phép mã kiểm tra kiểu vẫn nhận dạng cơ sở của bạn.
Không, không phải vậy.
Các thuộc tính là siêu dữ liệu và được lưu trữ ở dạng nhị phân trong tập hợp đã biên dịch (đó cũng là lý do tại sao bạn chỉ có thể sử dụng các loại đơn giản trong chúng).
Tôi không tin như vậy. Ngay cả khi tôi sai, điều tốt nhất bạn có thể hy vọng là thêm chúng vào toàn bộ Loại, không bao giờ là phiên bản của Loại.
Nếu bạn cần một cái gì đó để có thể thêm động, các thuộc tính c # không phải là cách. Nhìn vào việc lưu trữ dữ liệu trong xml. Gần đây tôi đã thực hiện một dự án mà tôi đã bắt đầu w / các thuộc tính, nhưng cuối cùng đã chuyển sang tuần tự hóa w / xml.
Tại sao bạn cần phải? Các thuộc tính cung cấp thêm thông tin để phản ánh, nhưng nếu bên ngoài bạn biết thuộc tính nào bạn muốn thì bạn không cần chúng.
Bạn có thể lưu trữ dữ liệu meta bên ngoài tương đối dễ dàng trong cơ sở dữ liệu hoặc tệp tài nguyên.
Tôi đã rất cố gắng với System.ComponentModel.TypeDescriptor mà không thành công. Điều đó không có nghĩa là nó không hoạt động nhưng tôi muốn xem mã cho điều đó.
Trong phần đối ứng, tôi muốn thay đổi một số giá trị Thuộc tính. Tôi đã làm 2 chức năng hoạt động tốt cho mục đích đó.
// ************************************************************************
public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, description);
}
}
}
// ************************************************************************
public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, isReadOnly);
}
}
}
Trong Java, tôi thường xử lý vấn đề này bằng cách sử dụng bản đồ và tự thực hiện mã hóa Key-Value.
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
TypeDescriptor
- không chỉPropertyGrid
.