2009-10-29 11 views
10

Có cách nào để tự động đặt tên thuộc tính của một loại ẩn danh không?Tự động đặt tên thuộc tính của một loại ẩn danh C#

Thông thường chúng ta sẽ làm như thế này:

var anon = new { name = "Kayes" }; 

Bây giờ tôi muốn thiết lập tên (hoặc định danh) của tài sản tự động, vì vậy mà tên này có thể đến từ một tập tin XML hoặc một cơ sở dữ liệu .


Cảm ơn các bạn đã trả lời. Không, nhu cầu của tôi chắc chắn không xứng đáng với tất cả các lựa chọn thay thế tẻ nhạt. Tôi chỉ muốn làm cho mã của tôi tuân thủ với một thư viện hiện có được phát triển bởi nhóm của tôi. Nhưng chúng tôi quyết định cập nhật thư viện để hỗ trợ các loại từ điển để có thể dễ dàng giải quyết.

Pete, tôi thực sự vui mừng khi tìm hiểu về các loại động trong .NET 4.0

Cảm ơn.

+0

Để biết thêm C# phiên bản gần đây thấy: http://stackoverflow.com/questions/3740021/how -to-dynamic-new-anonymous-class – nawfal

Trả lời

2

Không phải không có một lượng lớn phản chiếu, có thể là điều bạn muốn quan tâm hơn đến việc bạn đang làm gì. Có lẽ bạn nên xem xét thay vì sử dụng một từ điển, với giá trị quan trọng là tên thuộc tính.

0

Trình biên dịch phải biết về tên thuộc tính, nếu không, trình biên dịch không thể tạo loại ẩn danh cho bạn.

Vì vậy, không, điều này là không thể, trừ khi tên thuộc tính thực tế được biết tại thời gian biên dịch (thông qua một số ma thuật do VS tạo ra với cơ sở dữ liệu hoặc một cái gì đó).

3

Điều đó là không thể bởi vì mặc dù loại là ẩn danh, nhưng nó không phải là loại động. Nó vẫn là một kiểu tĩnh và các thuộc tính về nó phải được biết tại thời gian biên dịch.

Bạn có thể muốn kiểm tra từ khóa "động" .NET 4.0 để tạo các lớp động thực sự.

0

tính động có thể được thực hiện với compiling code at runtime nhưng điều này sẽ là quá mức cần thiết cho nhu cầu của bạn tôi đoán ...

0

Nope. Bạn muốn xây dựng một cấu trúc tĩnh từ thông tin động. Sẽ không làm việc, suy nghĩ về nó. Sử dụng từ điển cho trường hợp của bạn.

1

Như đã đề cập, bạn không thể thay đổi tên thuộc tính; làm thế nào bạn sẽ mã chống lại nó, ví dụ? Tuy nhiên, nếu điều này là để ràng buộc dữ liệu, bạn có thể thực hiện một số thủ thuật để bẻ cong tên hiển thị của thuộc tính trong thời gian chạy - ví dụ: ICustomTypeDescriptor/TypeDescriptionProvider (và tùy chỉnh PropertyDescriptor).

Rất nhiều công việc; nó sẽ cần phải thực sự được giá trị nó ...

Một lựa chọn khác là một thuộc tính tùy chỉnh:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 
class MyDisplayNameAttribute : DisplayNameAttribute { 
    public MyDisplayNameAttribute(string value) : base(value) {} 
    public override string DisplayName { 
     get { 
      return @"/// " + base.DisplayNameValue + @" \\\"; 
     } 
    } 
} 
class Foo { 
    [MyDisplayName("blip")] 
    public string Bar { get; set; } 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     using (Form form = new Form { 
      Controls = { 
       new PropertyGrid { 
        Dock = DockStyle.Fill, 
        SelectedObject = new Foo { Bar = "abc"}} 
      } 
     }) { 
      Application.Run(form); 
     } 
    } 
}