2010-10-24 27 views
6

tôi muốn tạo một kiểu ẩn danh bên trong một hàm, khi các thuộc tính kiểu ẩn danh là các tham số hàm.Tạo một kiểu ẩn danh từ phản chiếu ParamInfo []

ví dụ: đối với hàm: bool riêng CreatePerson (chuỗi FirstName, string LasName, int Age, int height);

tôi sẽ có loại ẩn danh với các thuộc tính: FirstName, LasName, Age và height. và các giá trị của tham số hàm sẽ là giá trị của thuộc tính loại ẩn danh.

private bool CreatePerson(string FirstName, string LasName, int Age, int height) 
    { 
     // Get this method parameters 
     MethodBase currentMethod = MethodBase.GetCurrentMethod(); 
     ParameterInfo[] parametersInfo = currentMethod.GetParameters(); 

     // create an object of the parameters from the function. 
     foreach (ParameterInfo paramInfo in parametersInfo) 
     { 
      // add a property with the name of the parameter to an anonymous object and insert its value to the property. 
      // WHAT DO I DO HERE? 
      .... 
     } 

     return true; 
    } 
+0

Bạn muốn tạo loại ẩn danh với tên và loại trường đã biết, tại sao bạn cần phản ánh? new {FirstName = FirstName, ...} sẽ hoạt động tốt? – SoftMemes

+0

Ông ấy muốn điều đó được xác định trong thời gian chạy - tôi tin. – Aliostad

+0

@Aliostad - nhưng mô tả chỉ ra rằng _values_ phải đến từ các tham số, tên của các tham số/thuộc tính đã có ở đó ... – SoftMemes

Trả lời

2

Nếu tôi hiểu chính xác và bạn muốn xác định thuộc tính trong thời gian chạy, điều này là không thể. Mặc dù trong các loại ẩn danh, bạn có thể tạo các loại mà bạn xác định ở đó và sau đó bằng cách gán giá trị, tên của các thuộc tính phải được biết tại thời gian biên dịch.

Thực tế, loại này ẩn danh với bạn nhưng không ẩn danh với CLR. Nếu bạn nhìn vào lắp ráp trong ildasm.exe hoặc phản xạ, bạn sẽ thấy những loại vô danh với tên lạ luôn có <> trong tên của chúng.

Hoạt động của C# có thể giúp ích ở đây nhưng theo tôi biết, chúng giúp với giao tiếp với các đối tượng không có thông tin loại, không tạo - nhưng có thể có cách tôi làm không biết.

+0

Nó hoàn toàn có thể sử dụng Reflection.Emit để tạo ra một kiểu mới trong thời gian chạy mặc dù, nhưng tôi không thể thấy lý do tại sao bạn sẽ muốn cho một cái gì đó như thế này. – SoftMemes

+0

Đúng, viết mã và biên dịch luôn luôn là một khả năng nhưng đó không phải là anh ta muốn làm. – Aliostad

+0

Reflection.Emit không thực sự là "viết mã và biên dịch" vì không có mã nguồn, nhưng tôi đồng ý rằng rất có thể đó không phải là những gì anh ta cần. – SoftMemes

0

Bạn không thể sử dụng mẫu thiết kế "Linq to DataSet" Field<T>(String Name)? Trong thực tế, tại sao không chỉ sử dụng một DataTable. Trình biên dịch không cần phải biết rằng trường tồn tại, chỉ loại nó là loại an toàn. Một lý do để làm điều này là triển khai một số loại trình phân tích cú pháp để tạo bộ lọc hoặc để định cấu hình các tên trường động.

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