2009-03-29 4 views

Répondre

1

Ceci n'est pas possible. Si vous y réfléchissez, un paramètre de type est résolu au moment de la compilation, alors que System.Type est résolu par réflexion au moment de l'exécution. Maintenant, après avoir dit que c'est impossible, c'est possible en utilisant la réflexion. Si vous créez la classe avec un reflet, vous pouvez passer un paramètre System.Type en paramètre, mais il vaut sans doute mieux redessiner tout ce que vous essayez de faire.

EDIT: Voici quelques idées pour une refonte.

D'où vient le System.Type? Pourriez-vous le transmettre en tant que paramètre de type lui-même afin qu'il puisse être transmis?

Sinon, pourriez-vous faire un adaptateur qui gère les types connus qui seront utilisés? Peut-être une déclaration de commutateur qui convertit du System.Type au bon type d'appel générique? Tout est plus rapide que la réflexion.

0

Vous pouvez le faire en utilisant la réflexion. Vous ne voulez pas changer votre conception à la place (pour éviter la reflaction)?

Vous pouvez donc transmettre votre type en tant que paramètre:

DoSomething(yourObject.GetTaype()); 
0

Envisagez d'utiliser un autre modèle. Les types génériques sont destinés à être résolus statiquement au moment de la compilation.

Encore, c'est possible. Vous devez recourir à la réflexion:

public class TypeReporter<T> { 
    public TypeReporter() { 
     Console.WriteLine("this type is: {0}", typeof(T)); 
    } 

    // other methods 
} 

public class StackOverflow694683 { 
    static void Main() { 
     string n = "..."; // Pick a type, such as System.String. 
     Type arg = Type.GetType(n); 
     Type genericClass = typeof(TypeReporter<>); 
     Type createdClass = genericClass.MakeGenericType(arg); 

     // Result is of TypeReporter<T> type. Invoke desired methods. 
     object result = Activator.CreateInstance(createdClass); 
    } 
} 
1

Ce que vous demandez de faire n'est pas possible dans .Net. Les paramètres de type sont une opération de type compilation dans .Net (C# et VB). Une instance System.Type est une construction d'exécution. Toute interrogation sur le type réel derrière System.Type doit se produire au moment de l'exécution. Ainsi, les solutions ne sont pas compatibles.

Par exemple:

public void DoSomething<T>(T value) { 
    // Do something with a value of type T 
} 

public Example1() { 

    DoSomething(42); // Calls DoSomething<int> 
    Type t1 = typeof(int); 
    DoSomething(t1); // Calls DoSomething<Type> 

    object o1 = 42; 
    Type t2 = o1.GetType(); 
    DoSomething(???) // No way to call DoSomething<int> here without some 
        // wild reflection because the call to DoSomething is 
        // established at compile type where t2 is established 
        // at runtime 
} 
0

Ce que vous faites habituellement est d'avoir la méthode pour surcharge générique spécifiquement pour ce genre d'opérations. E.g .:

Load<T>(); 
Load(Type type); 
+0

C'est ce que je fais habituellement, mais la méthode est une tierce partie et elle accepte seulement SomeMethod (); structure ... c'est pourquoi je demandais .. –

Questions connexes