Tôi giả sử bạn thường làm một cái gì đó như thế này như một phần của việc thực hiện nhà máy, nơi các loại thực aren không biết tại thời điểm biên dịch ...
Trước tiên, lưu ý rằng cách tiếp cận dễ dàng hơn có thể là bước init sau tạo, sau đó bạn có thể sử dụng Generics:
static T Create<T>({args}) where T : class, ISomeInitInterface, new() {
T t = new T();
t.Init(args);
return t;
}
Sau đó, bạn có thể sử dụng MakeGenericMethod
và/hoặc CreateDelegate
.
Nếu không; bạn có thể thực hiện việc này khi đang bay với Expression
(3.5) hoặc DynamicMethod
(2.0).
Các Expression
cách tiếp cận dễ dàng hơn để mã:
var param = Expression.Parameter(typeof(int), "val");
var ctor = typeof(Foo).GetConstructor(new[] { typeof(int) });
var lambda = Expression.Lambda<Func<int, Foo>>(
Expression.New(ctor, param), param);
var func = lambda.Compile();
Foo foo = func(123);
string s = foo.ToString(); // proof
hoặc (sử dụng DynamicMethod
):
ConstructorInfo ctor = typeof(Foo).GetConstructor(new[] { typeof(int) });
DynamicMethod dm = new DynamicMethod("Create", typeof(Foo),
new Type[] { typeof(int) }, typeof(Foo), true);
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Ret);
Converter<int, Foo> func = (Converter<int, Foo>)
dm.CreateDelegate(typeof(Converter<int, Foo>));
Foo foo = func(123);
string s = foo.ToString(); // proof
Nguồn
2009-10-21 15:35:23
Câu hỏi thú vị. Tôi tin rằng các nhà xây dựng là các phương pháp hiệu quả đến mức CLR có liên quan, nhưng tôi sẽ không biết cú pháp. – Noldorin
Tôi quan tâm: tại sao bạn muốn làm điều đó? –
Tôi nghi ngờ câu trả lời là không có tuy nhiên. – Noldorin