我假設你通常會做這樣的事情作爲一個工廠實現,其中實際類型AREN的一部分在編譯時不知道...
首先,請注意,更簡單的方法可能是創建初始化步驟,然後您可以使用泛型:
static T Create<T>({args}) where T : class, ISomeInitInterface, new() {
T t = new T();
t.Init(args);
return t;
}
然後,您可以使用MakeGenericMethod
和/或CreateDelegate
。
否則;您可以使用Expression
(3.5)或DynamicMethod
(2.0)進行此操作。
的Expression
方法更容易代碼:
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
或(使用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
有趣的問題。就CLR而言,我認爲構造函數是有效的方法,但我不知道語法。 – Noldorin 2009-10-21 13:06:57
我很感興趣:你爲什麼要這麼做? – 2009-10-21 13:07:34
但我懷疑答案是否定的。 – Noldorin 2009-10-21 13:07:46