Le titre est assez obscur. Ce que je veux savoir, c'est si cela est possible:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Évidemment, MyGenericClass est décrit comme:
public class MyGenericClass<T>
À l'heure actuelle, le compilateur se plaint que 'Le type ou l'espace de noms' myType 'est introuvable. "Il doit y avoir un moyen de le faire.
foo.Method((dynamic)myGenericClass)
pour la liaison de méthode d'exécution, en fait le modèle de localisateur de service pour les surcharges de méthode d'un type.public void Method<T>(T obj)
- une astuce que j'ai utilisée plus de quelques fois au cours des 6 dernières années depuis ce commentaire; pRéponses:
Vous ne pouvez pas faire cela sans réflexion. Cependant, vous pouvez le faire avec la réflexion. Voici un exemple complet:
Remarque: si votre classe générique accepte plusieurs types, vous devez inclure les virgules lorsque vous omettez les noms de type, par exemple:
la source
Malheureusement non il n'y en a pas. Les arguments génériques doivent pouvoir être résolus au moment de la compilation comme 1) un type valide ou 2) un autre paramètre générique. Il n'y a aucun moyen de créer des instances génériques basées sur des valeurs d'exécution sans le gros marteau de l'utilisation de la réflexion.
la source
Quelques instructions supplémentaires pour exécuter avec le code des ciseaux. Supposons que vous ayez une classe similaire à
Supposons qu'au moment de l'exécution vous ayez un FooContent
Si vous pouviez vous lier au moment de la compilation, vous voudriez
Cependant, vous ne pouvez pas le faire au moment de l'exécution. Pour ce faire au moment de l'exécution, procédez comme suit:
Pour invoquer dynamiquement
Markdown(IEnumerable<FooContent> contents)
Notez l'utilisation de
dynamic
dans l'appel de méthode. Au moment dedynamicList
l' exécution le seraList<FooContent>
(en plus aussiIEnumerable<FooContent>
) puisque même l'utilisation de dynamic est toujours enracinée dans un langage fortement typé, le classeur d'exécution sélectionnera laMarkdown
méthode appropriée . S'il n'y a pas de correspondance de type exact, il recherchera une méthode de paramètre d'objet et si aucune ne correspond, une exception de lieur d'exécution sera déclenchée pour avertir qu'aucune méthode ne correspond.L'inconvénient évident de cette approche est une énorme perte de sécurité de type au moment de la compilation. Néanmoins, un code de ce type vous permettra d'opérer dans un sens très dynamique qui, au moment de l'exécution, est toujours entièrement tapé comme vous vous attendez à ce qu'il soit.
la source
Mes exigences étaient légèrement différentes, mais j'espère aider quelqu'un. J'avais besoin de lire le type à partir d'une configuration et d'instancier dynamiquement le type générique.
Enfin, voici comment vous l'appelez. Définissez le type avec un backtick .
la source
Si vous savez quels types seront passés, vous pouvez le faire sans réfléchir. Une instruction switch fonctionnerait. Évidemment, cela ne fonctionnerait que dans un nombre limité de cas, mais ce sera beaucoup plus rapide que la réflexion.
la source
Dans cet extrait, je veux montrer comment créer et utiliser une liste créée dynamiquement. Par exemple, j'ajoute à la liste dynamique ici.
De même, vous pouvez invoquer toute autre méthode de la liste.
la source