L'instanciation d'un constructeur avec paramètres dans une classe interne avec réflexion
J'ai quelque chose le long des lignes de ce:
object[] parameter = new object[1];
parameter[0] = x;
object instantiatedType =
Activator.CreateInstance(typeToInstantiate, parameter);
et
internal class xxx : ICompare<Type>
{
private object[] x;
# region Constructors
internal xxx(object[] x)
{
this.x = x;
}
internal xxx()
{
}
...
}
Et j'obtiens:
jeta de l'exception: System.MissingMethodException: Constructeur type 'xxxx.xxx' ne trouve pas..
Des idées?
- J'ai d'abord si vous avez l'intention
parameter
être la chose que vous avez passé commex
. Cependant, je viens de réaliser que ce n'est probablement pas ce que vous vouliez dire, et, en regardant les autres réponses, il semble que je ne suis pas le seul. Si cela est correct, je suggère de renommerparameter
àparameters
. Ou mieux encore, se passer deparameter
tout à fait:Activator.CreateInstance(typeToInstantiate, new object[]{x})
.
Vous devez vous connecter pour publier un commentaire.
Le problème est que
Activateur.CreateInstance(Type, de l'objet[])
ne considère pas non-public des constructeurs.C'est facilement démontré en changeant le constructeur de
public
visibilité; le code fonctionne correctement.Voici une solution de contournement (testé):
Si vous n'avez besoin que le constructeur sans paramètre cela fonctionne ainsi:
BindingFlags
àBindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
(testé avec succès)
Il y a deux questions à cette adresse:
new object[] {parameter}
aide à gérer le problème de passage d'unobject[]
comme un unique paramètre de la méthode qui prend unparams object[]
argumentBindingFlags
permet de résoudre le non-public constructeur(les deux
null
s se rapportent à la liant; le classeur par défaut le comportement est très bien pour ce que nous voulons)Activator.CreateInstance()
fait vraiment encapsulation hors de propos. Vraiment joli!Vous devez appeler une autre surcharge de
Activateur.CreateInstance
qui vous permet de passer unnonPublic
ouBindingFlags
paramètre.Je trouve tous ces
CreateInstance
surcharges maladroit; ce que je préfère faire:typeToInstantiate.GetConstructor()
, en passantBindingFlags.NonPublic
ConstructorInfo.Invoke
, en lui passant le paramètre de constructeurchanger de
C'est parce que votre constructeur prévoit également un tableau d'objets et activateur déjà divise en deux objets