2008-12-24 40 views
18

Tôi cố gắng để xây dựng một đối tượng thông qua một thuộc tính trên một tài sản lớp học mà xác định một cột trong một dòng dữ liệu được cung cấp đó là giá trị của tài sản, như sau:C thiết lập giá trị tài sản thông qua phản ánh với các thuộc tính #

[StoredDataValue("guid")] 
    public string Guid { get; protected set; } 

    [StoredDataValue("PrograGuid")] 
    public string ProgramGuid { get; protected set; } 

trong một phương pháp xây dựng() trên một đối tượng cơ sở, tôi nhận được các giá trị thuộc tính thiết lập bằng các tài sản như

 MemberInfo info = GetType(); 
     object[] properties = info.GetCustomAttributes(true); 

Tuy nhiên, vào thời điểm này tôi nhận ra những hạn chế trong hiểu biết của tôi.

Để bắt đầu, tôi dường như không lấy lại thuộc tính chính xác.

Và làm cách nào để đặt các thuộc tính này thông qua sự phản chiếu, bây giờ tôi có các thuộc tính? Tôi đang làm/suy nghĩ một cái gì đó về cơ bản không chính xác?

Trả lời

38

Có một vài vấn đề riêng biệt ở đây

  • typeof(MyClass).GetCustomAttributes(bool) (hoặc GetType().GetCustomAttributes(bool)) trả về thuộc tính trên lớp chính nó, không phải là thuộc tính trên các thành viên. Bạn sẽ phải gọi typeof(MyClass).GetProperties() để nhận danh sách thuộc tính trong lớp và sau đó kiểm tra từng thuộc tính.

  • Khi bạn đã có thuộc tính, tôi nghĩ bạn nên sử dụng Attribute.GetCustomAttribute() thay vì MemberInfo.GetGustomAttributes() vì bạn biết chính xác thuộc tính bạn đang tìm kiếm.

Dưới đây là một đoạn mã nhỏ để giúp bạn bắt đầu:

PropertyInfo[] properties = typeof(MyClass).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    StoredDataValueAttribute attribute = 
     Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute; 

    if (attribute != null) // This property has a StoredDataValueAttribute 
    { 
     property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes 
    } 
} 

EDIT: Đừng quên rằng Type.GetProperties() chỉ trả lại tài sản công cộng theo mặc định. Bạn sẽ phải sử dụng Type.GetProperties(BindingFlags) để nhận các loại thuộc tính khác.

+0

Tôi sẽ cung cấp cho một thử nghiệm và cho bạn biết, có vẻ hợp lý mặc dù – johnc

+0

Thuộc tính.GetCustomAttribute (...) trả về một mảng của System.Attribute và không thể chỉ đơn giản là đúc cho thuộc tính chính nó. Ví dụ được hiển thị thậm chí không biên dịch cho phép làm việc một mình. Bạn cần phải kiểm tra độ dài mảng để xem liệu thuộc tính mong muốn có tồn tại hay không và chuyển phần tử đầu tiên đến loại được yêu cầu thay thế. –

+0

Ví dụ sử dụng GetCustomAttribute, không phải GetCustomAttributes. Ví dụ biên dịch khi tôi thử nó (tất nhiên, thay đổi tên thuộc tính). –

Các vấn đề liên quan