2009-12-21 4 views
2

je cache basé surComment distinguer MethodBase des génériques

Dictionary<MethodBase, string> 

La clé est rendue de MethodBase.GetCurrentMethod. Tout fonctionnait bien jusqu'à ce que les méthodes soient explicitement déclarées. Mais un jour il est apparu que:

Method1<T>(string value) 

Makes même entrée dans le dictionnaire lorsque T est absolument différents types. Donc, ma question concerne la meilleure façon de mettre en cache la valeur pour les méthodes génériques. (Bien sûr, je peux fournir un wrapper qui fournit GetCache et l'égalité des types génériques rencontrés, mais cette façon ne semble pas élégante).

Mise à jour Voici ce que je veux exactement:

static Dictionary<MethodBase, string> cache = new Dictionary<MethodBase, string>(); 
static void Method1<T>(T g) 
{ 
    MethodBase m1 = MethodBase.GetCurrentMethod(); 
    cache[m1] = "m1:" + typeof(T); 
} 
public static void Main(string[] args) 
{ 
    Method1("qwe"); 
    Method1<Stream>(null); 
    Console.WriteLine("===Here MUST be exactly 2 entry, but only 1 appears=="); 
    foreach(KeyValuePair<MethodBase, string> kv in cache) 
     Console.WriteLine("{0}--{1}", kv.Key, kv.Value); 
} 
+0

Voulez-vous une entrée de cache différent pour chaque ensemble de paramètres de type ou d'une entrée de cache différent pour chaque morceau physique de code (ma réponse)? – SLaks

+1

Cela semble être impossible. – SLaks

Répondre

1

Utilisez MakeGenericMethod, si vous le pouvez:

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

class Program 
{ 
    static Dictionary<MethodBase, string> cache = new Dictionary<MethodBase, string>(); 

    static void Main() 
    { 
     Method1(default(int)); 
     Method1(default(string)); 
     Console.ReadLine(); 
    } 

    static void Method1<T>(T g) 
    { 
     var m1 = (MethodInfo)MethodBase.GetCurrentMethod(); 
     var genericM1 = m1.MakeGenericMethod(typeof(T)); // <-- This distinguishes the generic types 
     cache[genericM1] = "m1:" + typeof(T); 
    } 
} 
+0

c'est une question très ancienne, mais je viens juste de passer du temps à l'évaluer. Ça a l'air vraiment bien! – Dewfy

1

Ce n'est pas possible; une méthode générique a un seul MethodBase; il n'a pas un MethodBase par ensemble d'arguments génériques.

Questions connexes