Passer D'Un Système Instancié.Type de Type de Paramètre pour une Classe Générique
Le titre est une sorte d'obscur. Ce que je veux savoir c'est si c'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>
Droit maintenant, le compilateur se plaint que " Le type ou d'espace de noms 'myType' n'a pas pu être trouvé." Il y a obtenu d'être une façon de le faire.
- Les génériques != modèles. Tous les génériques des variables de type sont résolus au moment de la compilation et non à l'exécution. C'est l'une de ces situations où la "dynamique" type de 4.0 peut être utile.
- de quelle manière? Lorsqu'il est utilisé avec les médicaments génériques, en vertu de l'actuel CTP, vous retrouvez l'appel de la <object> les versions (sauf si je suis en manque un truc...)
- vous pouvez utiliser
foo.Method((dynamic)myGenericClass)
pour le moment de l'exécution de la méthode de liaison, effectivement le service localisateur de modèle pour un type de méthode de surcharges. - oui, pour certains génériques
public void Method<T>(T obj)
- un truc que j'ai utilisé plus d'une fois dans les 6 dernières années depuis que le commentaire ;p - est-il un moyen de modifier ça pour que la méthode instancie il?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire cela sans réflexion. Cependant, vous peut 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 si vous omettez les noms de type, par exemple:
Malheureusement non, il n'est pas. Les arguments génériques doit être résolu au moment de la Compilation que soit 1) d'un type valide ou 2) un autre paramètre générique. Il n'y a aucun moyen de créer les instances génériques en fonction des valeurs de l'exécution sans le gros marteau de l'aide de la réflexion.
Quelques autres, comment courir avec des ciseaux code. Supposons que vous avez une classe similaire à
Supposons que lors de l'exécution, vous avez un FooContent
Si vous avez été capable de se lier au moment de la compilation que vous voulez
Cependant vous ne pouvez pas le faire au moment de l'exécution. Pour ce faire, au moment de l'exécution que vous feriez le long des lignes de:
Pour invoquer dynamiquement
Markdown(IEnumerable<FooContent> contents)
Remarque l'utilisation de
dynamic
dans l'appel de méthode. Au moment de l'exécutiondynamicList
seraList<FooContent>
(en outre également êtreIEnumerable<FooContent>
), puisque même l'utilisation de la dynamique est toujours enraciné dans un langage fortement typé, le temps d'exécution classeur de sélectionner laMarkdown
méthode. Si il n'est pas exacte type de matchs, il va chercher un objet en paramètre de la méthode et si aucun match de l'exécution de liant exception sera levée d'alerte qu'aucune méthode matchs.Le tirage évident de retour de cette approche est une énorme perte de sécurité de type au moment de la compilation. Néanmoins code le long de ces lignes qui vont vous permettre de fonctionner dans un très dynamique en ce sens qu'au moment de l'exécution est encore entièrement tapé comme vous l'attendez.
Mes exigences étaient légèrement différents, mais j'espère aider quelqu'un. J'avais besoin de lire le type de config et instancier le type générique de façon dynamique.
Enfin, ici, est de savoir comment vous l'appelez. Définir le type avec un backtick.
Si vous savez quels types seront écoulées, vous pouvez le faire sans réflexion. Une instruction switch serait de travailler. Bien évidemment, cela ne fonctionne que dans un nombre limité de cas, mais il sera beaucoup plus rapide que de réflexion.
Dans cet extrait de code, je veux vous montrer comment créer et utiliser un créé dynamiquement la liste. Par exemple, je vais ajouter à la liste dynamique ici.
De même, vous pouvez invoquer toute autre méthode sur la liste.