2

私はに基づいてキャッシュを持っています

Dictionary<MethodBase, string>

キーは MethodBase.GetCurrentMethod からレンダリングされます。メソッドが明示的に宣言されるまで、すべてが正常に機能しました。しかし、ある日、次のことが明らかになりました。

Method1<T>(string value)

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

2 に答える 2

1

これは不可能です; ジェネリック メソッドには単一の MethodBase があります。ジェネリック引数のセットごとに 1 つの MethodBase がありません。

于 2009-12-21T23:18:29.607 に答える
1

可能であれば、 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);
    }
}
于 2013-10-01T14:05:59.800 に答える