2010-12-12 8 views
3

Ich habe folgende Dienstprogramm-Routine, die, ob ein von einem bestimmten Typ leitet ich bestimmen:von generischem Typ ermitteln Typ Ableitung

private static bool DerivesFrom(Type rType, Type rDerivedType) 
{ 
    while ((rType != null) && ((rType != rDerivedType))) 
     rType = rType.BaseType; 
    return (rType == rDerivedType); 
} 

(eigentlich ich weiß nicht, ob es eine bequeme Möglichkeit zu testen, die Ableitung ...)

Das Problem ist, ich möchte feststellen, ob ein Typ von einem generischen Typ abgeleitet ist, aber ohne die generischen Argumente anzugeben.

Zum Beispiel kann ich schreiben:

DerivesFrom(typeof(ClassA), typeof(MyGenericClass<ClassB>)) 

aber was ich brauche, ist die folgende

DerivesFrom(typeof(ClassA), typeof(MyGenericClass)) 

Wie kann ich es erreichen?


Am Beispiel von Darin Miritrov, das ist eine Beispielanwendung:

using System; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class MyGenericClass<T> { } 
    public class ClassB {} 
    public class ClassA : MyGenericClass<ClassB> { } 

    class Program 
    { 
     static void Main() 
     { 
      bool result = DerivesFrom(typeof(ClassA), typeof(MyGenericClass<>)); 
      Console.WriteLine(result); // prints **false** 
     } 

     private static bool DerivesFrom(Type rType, Type rDerivedType) 
     { 
      return rType.IsSubclassOf(rDerivedType); 
     } 
    } 
} 

Antwort

5

Sie könnten die generischen Parameter offen lassen:

DerivesFrom(typeof(ClassA), typeof(MyGenericClass<>)); 

funktionieren soll. Beispiel:

public class ClassA { } 
public class MyGenericClass<T>: ClassA { } 

class Program 
{ 
    static void Main() 
    { 
     var result = DerivesFrom(typeof(MyGenericClass<>), typeof(ClassA)); 
     Console.WriteLine(result); // prints True 
    } 

    private static bool DerivesFrom(Type rType, Type rDerivedType) 
    { 
     return rType.IsSubclassOf(rDerivedType); 
    } 
} 

Beachten Sie auch die Verwendung von IsSubClassOf Methode, die Ihre DerivesFrom Verfahren vereinfachen soll und die Art der ihren Zweck vereiteln. Es gibt auch die Methode, die Sie sich ansehen können.

+0

@Luca, hast du dir die Probe angesehen, die ich zur Verfügung gestellt habe? Was stimmt damit nicht? Sie haben eine Basisklasse und eine abgeleitete generische Klasse genau so, wie Sie es in Ihrer Frage beschrieben haben. Die Verwendung eines offenen generischen Typs funktioniert zumindest in diesem Beispiel. Wenn es für Sie nicht funktioniert, müssen Sie ein vollständiges Beispiel mit Ihrer Klassenhierarchie bereitstellen, damit wir sehen können, was damit nicht stimmt. –

+0

Ja, tatsächlich habe ich meine Kommentare überprüft: Das Beispiel funktioniert. Ich muss meine Bewerbung vertiefen. – Luca

+0

Gefunden, warum meine Anwendung nicht funktioniert. Siehe das Beispiel: ClassA leitet sich vom generischen Typ ab, nicht umgekehrt. – Luca

Verwandte Themen