Bạn có thể tránh sử dụng DynamicInvoke
đó là đau đớn chậm. Bạn có thể sử dụng suy luận kiểu trong C# để có được kiểu ẩn danh của bạn được khởi tạo một cách tổng quát. Một cái gì đó như:
public static Func<object[], T> AnonymousInstantiator<T>(T example)
{
var ctor = typeof(T).GetConstructors().First();
var paramExpr = Expression.Parameter(typeof(object[]));
return Expression.Lambda<Func<object[], T>>
(
Expression.New
(
ctor,
ctor.GetParameters().Select
(
(x, i) => Expression.Convert
(
Expression.ArrayIndex(paramExpr, Expression.Constant(i)),
x.ParameterType
)
)
), paramExpr).Compile();
}
Bây giờ bạn có thể gọi điện,
var instantiator = AnonymousInstantiator(new { Name = default(string), Num = default(int) });
var a1 = instantiator(new object[] { "abc", 123 }); // strongly typed
var a2 = instantiator(new object[] { "xyz", 789 }); // strongly typed
// etc.
Bạn có thể sử dụng phương pháp AnonymousInstantiator
để tạo ra các chức năng để nhanh chóng bất kỳ loại vô danh với bất kỳ số lượng tài sản, chỉ mà bạn phải vượt qua một thích hợp ví dụ trước. Các tham số đầu vào phải được chuyển thành một mảng đối tượng. Nếu bạn lo lắng hiệu suất boxing ở đó thì bạn phải viết một instantiator tùy chỉnh chỉ chấp nhận các thông số đầu vào là string
và int
, nhưng việc sử dụng một instantiator như vậy sẽ bị giới hạn hơn một chút.
Có thể ghép đôi: http://stackoverflow.com/questions/606104/linq-expression-tree-question –
@Flash, điều này là không thể, ít nhất là không trực tiếp. Trình biên dịch thực hiện rất nhiều "phép thuật" cho bạn khi bạn tạo các kiểu vô danh - đó là cú pháp cú pháp để thực sự khai báo một lớp C# chính hãng với một loạt các thuộc tính. Trình biên dịch chỉ làm tất cả điều này cho bạn. Không có loại cây biểu thức nào thực sự thực hiện tất cả điều này cho bạn một cách tự động. Nếu bạn nhìn vào liên kết tôi đã tham chiếu, nó cung cấp một giải pháp thay thế. Tuy nhiên, nó sử dụng Reflection.Emit, mà không phải là cho feint của trái tim. –
Kirk: OP muốn * xây dựng * một lớp ẩn danh, không * tạo * một từ đầu. Miễn là anh ta biết thời gian biên dịch tên và kiểu của thuộc tính là gì, anh ta có thể lấy trình biên dịch để tạo kiểu cho anh ta và tất cả những gì anh ta phải làm là tìm ra cách để thể hiện nó. – Gabe