2012-02-03 21 views
7

Có ai biết cách tạo động một phiên bản Func<T> không?Sử dụng Activator.CreateInstance để tạo các trường hợp Func <T>

//Create the Func type 

Type funcType = typeof(Func<>).MakeGenericType(typeof(string)); 

//How do I pass a reference to the anonymous method? 

Activator.CreateInstance(funcType,() => "test"); 

này không biên dịch:

Không thể chuyển đổi biểu thức lambda để gõ object[] vì nó không phải là một loại đại biểu

Bất cứ ai?

+5

Cố gắng mô tả những gì bạn đang cố gắng để đạt được chứ không phải là làm thế nào bạn đang cố gắng để đạt được nó cho cơ hội tốt hơn một câu trả lời. – Jamiec

+0

Tôi đồng ý với Jamiec, vì thường là không gian tên Expression tốt hơn trong loại kịch bản này so với sự phản chiếu lõi cứng. – SWeko

+0

seesharper bạn có thể hãy xem câu hỏi này ánh sáng tiêm xin vui lòng? http://stackoverflow.com/questions/18931955/lightinject-ioc-container-throws-stackoverflow-when-resolving-type –

Trả lời

1

Tôi không nghĩ bạn có thể. This blog đi một số cách để giải thích vấn đề. Tôi đề nghị bạn tìm cách tiếp cận thay thế. Thay vào đó, bạn có thể sử dụng cây biểu thức không?

0

Bạn cần một đối tượng có thể được chuyển đổi thành System.Object, vì điều này bạn cần phải tạo một đại biểu như Func<String> trước tiên. Vì vậy, nó làm cho không có sence cho tôi để tạo ra Func<T> khi chạy.

3

Bạn cần phải sử dụng cây biểu thức:

var func = Expression.Lambda(Expression.Constant("test")).Compile(); 
var result = func.DynamicInvoke(); 
Các vấn đề liên quan