Je pense avoir trouvé, j'ai d'autre soucis de compatibilité de type à passer dans le constructeur, mais je post mon code pour le partage et pour en discuter / optimiser.
Soit on appel un Ctor vide : ConstructorInfo construct = type.GetConstructor(Type.EmptyTypes);
Soit on lui donne un tableau de type appelé dans le Ctor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| // Récupérer le type de l'objet en réflection
Type type = ClassePoco.GetType();
// récupére tous les Get publics de la classe en filtrant par instance, public et property
PropertyInfo[] proprietes = type.GetProperties(
BindingFlags.Instance
| BindingFlags.GetProperty
| BindingFlags.Public);
// récupére tous les types public de cette classe (ils sont appelé dans le Ctor de la Poco)
Type[] types = new Type[proprietes.Length];
// prépare un tableau des données : récupére le nom des propriétés de la classe pour comparer avec les champs
// et y trouver les valeurs à passer au Ctor
String[] NomsPropriete = new String[proprietes.Length];
int i=0;
foreach (PropertyInfo proprieteinfos in proprietes)
{
if (proprieteinfos.Name == "Id") continue; //ne traite pas la propriété public PkTable
types[i] = proprieteinfos.PropertyType;
NomsPropriete[i] = proprieteinfos.Name;
// Cherche la concordance de Nom dans la collection d'userControl "Champs" et récupére la valeur saisi par l'User
object valeur = ListeChamps.FirstOrDefault(t => t.nomChamp == proprieteinfos.Name).Value;
proprieteinfos.SetValue(proprieteinfos.Name, valeur, null);
i++;
}
// récupére le constructeur de la classe en lui passant la liste des types attendus pas le Ctor
ConstructorInfo construct = type.GetConstructor(types); |
Voila où j'en suis, le test avec un remplissage en dur retourne bien une instance viable, reste à passer les valeurs en lieu et lace.
object obj = construct.Invoke(new object[] {"commentaire","29/04/2015","mail","telfixe","telmobile","fax","nom","prenom",1});
Partager