Je suis en supposant que vous auriez normalement faire quelque chose comme ceci dans le cadre d'une usine de mise en œuvre, où les types réels ne sont pas connus au moment de la compilation...
Tout d'abord, notez qu'une approche plus facile peut-être un post-créer init étape, vous pouvez utiliser des génériques:
static T Create<T>({args}) where T : class, ISomeInitInterface, new() {
T t = new T();
t.Init(args);
return t;
}
Vous pouvez ensuite utiliser MakeGenericMethod
et/ou CreateDelegate
.
Autrement, vous pouvez faire cela avec à la volée avec Expression
(3.5) ou DynamicMethod
(2.0); l' Expression
approche est la plus simple (exemples sur le chemin...)
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
et
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