Générique de la Classe & Type de.GetType()
Peu un jeu de casse-tête, j'ai une classe générique
public abstract class MyClass<T> : UserControl
{
}
et j'ai un type comme ce
Type type = Type.GetType("Type From DB as String", true, true);
et que je veux créer et de l'instance de Maclasse à l'aide de l'... Mais cela ne fonctionne pas.
MyClass<type> control = (MyClass<type>)LoadControl("/UsercControl.ascx");
Des idées????
- Je voudrais utiliser un Cio. Est Code dans une boucle?
- Des Idées sur comment faire cela?
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ceci:
Maintenant, vous ne serez pas en mesure de utilisation que comme un
MyClass<T>
dans les termes de l'appel de méthodes sur elle, parce que vous ne connaissez pas laT
... mais vous pouvez définir un non-générique de base de la classe ou de l'interface avec certaines méthodes qui ne nécessitent pas d'T
, et le jeta à cela. Ou vous pouvez appeler les méthodes sur elle par la réflexion.typeof(MyClass<>)
) fonctionne certes. Test pour vous-même.instance
de ce type. Cependant,typeof(MyClass<>)
certainement est juridique.template.MakeGenericType
.Génériques dans la réflexion sont un peu plus complexes que cela. Ce que vous êtes à la recherche pour les GetGenericTypeDefinition() et MakeGenericType() méthodes. Prenez votre type générique (vous pouvez l'obtenir en appelant GetType() sur une instance, ou en utilisant typeof(
MyClass<Object>
)), et de l'appeler GetGenericTypeDefinition() pour obtenir la base, ouvert de type générique (MyClass<T>
). Puis, ce type d'appel MakeGenericType() et de lui passer un tableau avec un seul élément; le type que vous souhaitez utiliser pour fermer le générique. Que vous obtiendrez un générique de type fermé avec votre découverts dynamiquement type (MyClass<MyType>
), que vous pouvez transmettre à l'Activateur.CreateInstance().Vous créer de nouveaux objets à l'aide de la réflexion:
Vous devez construire l'intermédiaire de la classe réflexion.
Voir http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx pour plus de détails.