Question

J'ai un groupe de nœuds enfants MDI qui sont tous créés de la même manière et pour réduire le code redondant, j'aimerais pouvoir appeler une méthode, lui transmettre une chaîne (nom du nœud enfant), le faire créer. le noeud et l'ajouter au parent.

Je peux tout faire, sauf créer la classe à partir de la chaîne d'un nom de classe. Comment puis-je faire cela?

Était-ce utile?

La solution

Je l'utilise actuellement dans l'une de mes applications pour créer une nouvelle classe

public static IMobileAdapter CreateAdapter(Type AdapterType)
{
  return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}

Il renvoie une instance d'une classe qui implémente IMobileAdapter, mais vous pouvez l'utiliser aussi facilement avec une chaîne:

public static IMyClassInterface CreateClass(string MyClassType)
{
  return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}

Appelez-le avec un code similaire à celui-ci:

IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");

Bien sûr, la classe qu'elle crée doit implémenter l'interface IMyClassInterface dans ce cas, mais avec une fabrique de classes, toutes vos classes implémenteraient de toute façon la même interface.

Modifier:

En référence à votre commentaire, aux fins de la présente discussion, pensez au terme "assemblage". en tant qu'ensemble de fichiers dans votre projet vb / cs. Je suppose que vous faites tout cela dans un seul projet [assemblage] et que vous ne le répartissez pas sur plusieurs projets.

Dans votre cas, alors que vos classes étendront l’objet Form, vous feriez quelque chose comme ceci.

Form myInst = CreateClass("MyExtendedForm");

Ou

Form myInst = CreateClass(Type.GetType("MyExtendedForm"));

Selon que vous obtenez le type dans votre méthode CreateClass ou en dehors de celle-ci. Vous devez convertir le type correct de votre instance pour pouvoir accéder aux membres personnalisés. Considérez ceci:

class MyCustomForm : Form
{
    public int myCustomField{ get; set; }
}

J'ai un formulaire personnalisé qui étend le formulaire en ajoutant la propriété myCustomField. Je souhaite instancier ceci à l'aide de Activator.CreateInstance ():

public static Form CreateClass(string InstanceName)
{
    return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}

Je l'appelle alors en utilisant:

Form myInst = CreateClass("MyCustomForm");

Alors maintenant, mon formulaire personnalisé est stocké dans myInst. Cependant, pour accéder à la propriété personnalisée [myCustomField], vous devez convertir votre instance sous la forme appropriée:

int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;

Autres conseils

Activator.CreateInstance(Type.GetType(typeName))

Si vous avez une chaîne qui est le nom de la classe, vous devriez pouvoir en obtenir un objet Type en appelant Type.GetType (chaîne). À partir de ce type, vous devriez pouvoir utiliser la réflexion pour générer un objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top