2009-10-23 8 views
0

J'utilise VB.Net. J'ai une classe d'objets appelée clsA (de T comme clsB). Selon ce que T est, je veux faire des choses différentes. Disons que clsC et clsD héritent tous deux de clsB et peuvent donc être utilisés pour T.Récupération de types d'argument génériques

Si j'ai une instance de clsA (de clsC), comment puis-je obtenir le type interne (c'est-à-dire clsC) en utilisant la réflexion?

Répondre

1

La réflexion est une technologie .NET - elle n'est spécifique ni à VB.NET ni à C#.

Compte tenu d'un objet, o, utilisez

o.GetType().GetGenericArguments()(0)

Cependant, il est probablement une mauvaise idée de varier explicitement votre comportement en fonction du type. Si vous avez besoin de faire des choses différentes en fonction de la classe « A » par rapport à la classe « B », alors vous devez utiliser des méthodes virtuelles ou des propriétés, et les remplace dans les types dérivés:

Public MustInherit Class BaseClass 
    Public MustOverride Function OneMethodTwoWays() As Integer 

    Public MustOverride ReadOnly Property OnePropertyTwoWays() As Integer 

End Class 

Public Class DerivedClass1 
    Inherits BaseClass 


    Public Overrides Function OneMethodTwoWays() As Integer 
     Return 1 + 1 
    End Function 

    Public Overrides ReadOnly Property OnePropertyTwoWays() As Integer 
     Get 
      Return 1 + 1 
     End Get 
    End Property 
End Class 

Public Class DerivedClass2 
    Inherits BaseClass 

    Public Overrides Function OneMethodTwoWays() As Integer 
     Return 2 * 1 
    End Function 

    Public Overrides ReadOnly Property OnePropertyTwoWays() As Integer 
     Get 
      Return 2 * 1 
     End Get 
    End Property 
End Class 

Public Class MyGeneric(Of T As BaseClass) 
    Public Function DoTheyMatch(ByVal a As T, ByVal b As T) As Boolean 
     Return a.OneMethodTwoWays() = b.OnePropertyTwoWays 
    End Function 
End Class 
+0

Merci, exactement ce dont j'avais besoin. – link664

0
public class MyClass<T> 
{ 
    public void MyMethod() 
    { 
     if (typeof(T).GetGenericArguments().First() == typeof(int)) 
     { 
      Console.WriteLine("Hello World!!!"); 
     } 
    } 
} 
0

est typeof travail ?

Type t = typeof (Apple); chaîne className = t.ToString();

0

J'aimerais voir un exemple concret de ce que vous essayez de faire. Chaque fois que vous prenez des actions différentes en fonction du type d'un objet, c'est un signe que vous devez revoir votre modèle d'objet.

Voici un exemple vraiment artificiel:

public void Talk(Animal a) 
{ 
    if (a is Dog) 
    { 
     Console.WriteLine("Woof!"); 
    } 
    else if (a is Cat) 
    { 
     Console.WriteLine("Meow!"); 
    } 
} 

Vous êtes bien mieux ajouter une méthode « Talk » virtuel pour animaux et en remplaçant dans Chien et Chat, afin que votre méthode devient:

public void Talk(Animal a) 
{ 
    a.Talk(); 
} 

Pouvez-vous refactoriser votre code de sorte que la classe générique n'ait pas besoin d'en savoir trop sur son type paramétré?

+0

Mon exemple récent de ceci était avec une recherche de Solr. Il renvoie un objet XML basé sur la configuration. J'ai donc un projet qui génère une classe basée sur le schéma de Solr, et le remplit à partir de la réponse xml. J'espère que cela a du sens. –

+0

Je veux être en mesure de recueillir des valeurs en fonction de T, puis créer une nouvelle instance de T. En utilisant votre exemple, je veux déclarer Object (de Dog), puis définir une propriété appelée Toy comme une instance de Bone. Si je déclare Object (de Cat), le Toy doit être une instance de Mouse. Une fois que cette propriété est définie, je vais créer une nouvelle instance de Cat/Dog avec la propriété Toy pour l'ensemble d'objets. Je sais qu'il y a des tas de façons de le faire, mais il y a d'autres facteurs qui expliquent pourquoi je vais dans cette direction. – link664

+0

@ link664 - Assez juste. Je voulais juste mettre cela à la place pour que les autres puissent voir qu'il y a parfois une meilleure option. –

Questions connexes