Vous pouvez utiliser des expressions Linq comme expliqué dans ce blog post dans votre cas, il serait
ConstructorInfo ctor = typeof(LoginView).GetConstructors().First();
ObjectActivator<LoginView> createdActivator = GetActivator<LoginView>(ctor);
LoginView instance = createdActivator();
Au cas où le lien va vers le bas, c'est ObjectActivator
délégué
delegate T ObjectActivator<T>(params object[] args);
et la méthode GetActivator
public static ObjectActivator<T> GetActivator<T>
(ConstructorInfo ctor)
{
Type type = ctor.DeclaringType;
ParameterInfo[] paramsInfo = ctor.GetParameters();
//create a single param of type object[]
ParameterExpression param =
Expression.Parameter(typeof(object[]), "args");
Expression[] argsExp =
new Expression[paramsInfo.Length];
//pick each arg from the params array
//and create a typed expression of them
for (int i = 0; i < paramsInfo.Length; i++)
{
Expression index = Expression.Constant(i);
Type paramType = paramsInfo[i].ParameterType;
Expression paramAccessorExp =
Expression.ArrayIndex(param, index);
Expression paramCastExp =
Expression.Convert (paramAccessorExp, paramType);
argsExp[i] = paramCastExp;
}
//make a NewExpression that calls the
//ctor with the args we just created
NewExpression newExp = Expression.New(ctor,argsExp);
//create a lambda with the New
//Expression as body and our param object[] as arg
LambdaExpression lambda =
Expression.Lambda(typeof(ObjectActivator<T>), newExp, param);
//compile it
ObjectActivator<T> compiled = (ObjectActivator<T>)lambda.Compile();
return compiled;
}
Un avantage à utiliser cette méthode sur la méthode générique est que vous pouvez facilement passer dans les paramètres à votre constructeur mais le désavantage étant le code plus verbeux.
'new LoginView()' devrait fonctionner. Ou est-ce que je manque quelque chose? –
En cache un délégué compilé qui appelle le ctor. – SLaks
Je suppose que 'typeof (LoginView)' n'est pas l'argument réel, ou bien vous auriez pu écrire 'new LoginView()', comme le suggère Cédric. Mais dans tous les cas, êtes-vous sûr que lag vient de la couche de réflexion et non du constructeur 'LoginView' lui-même? –