Как отличить MethodBase от дженериков

У меня есть кеш на основе

Dictionary<MethodBase, string>

Ключ создается из MethodBase.GetCurrentMethod. Все работало нормально, пока методы не были явно объявлены. Но однажды оказывается, что:

Method1<T>(string value)

Делает одну и ту же запись в Dictionary, когда T получает абсолютно разные типы.

Итак, мой вопрос о лучшем способе кэширования значения для общих методов. (Конечно, я могу предоставить оболочку, которая предоставляет GetCache и равенство встречающихся универсальных типов, но этот способ не выглядит элегантным).

Обновить Вот что я точно хочу:

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);
}

person Dewfy    schedule 21.12.2009    source источник
comment
Вам нужна отдельная запись в кеше для каждого набора параметров типа или другая запись в кеше для каждого физического фрагмента кода (мой ответ)?   -  person SLaks    schedule 21.12.2009
comment
Это кажется невозможным.   -  person SLaks    schedule 21.12.2009


Ответы (2)


Используйте MakeGenericMethod, если можете:

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);
    }
}
person Ryszard Dżegan    schedule 01.10.2013
comment
это очень старый вопрос, но я только что потратил некоторое время, чтобы оценить его. Выглядит действительно хорошо! - person Dewfy; 01.10.2013

Это невозможно; общий метод имеет одну базу методов; у него нет одного MethodBase на набор общих аргументов.

person kvb    schedule 21.12.2009