Ich nehme an, Sie würden so etwas wie dies als Teil einer Fabrik Umsetzung in der Regel tun, wo die tatsächlichen Typen aren 't zur Kompilierungszeit bekannt ...
Beachten Sie zuerst, dass ein einfacher Ansatz möglicherweise ein Post-Create-Init-Schritt ist, dann können Sie Generics verwenden:
static T Create<T>({args}) where T : class, ISomeInitInterface, new() {
T t = new T();
t.Init(args);
return t;
}
Sie können dann MakeGenericMethod
und/oder CreateDelegate
verwenden.
Sonst; Sie können dies mit on-the-fly mit Expression
(3.5) oder DynamicMethod
(2.0) tun.
Der Expression
Ansatz ist einfacher Code:
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
oder (mit 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
Interessante Frage. Ich glaube, Konstrukteure sind in Bezug auf die CLR effektiv Methoden, aber ich würde die Syntax nicht kennen. – Noldorin
Ich bin interessiert: Warum möchten Sie das tun? –
Ich vermute die Antwort ist aber nein. – Noldorin