2009-12-21 4 views
1

Этот вопрос Продолжение How to distinguish MethodBase in genericsОбнаружить общие параметры MethodBase

Вкратце: мне нужно различать в Dictionary же универсального метода, когда она вызывается для различных типов замещения родовыми.

static Dictionary<MethodBase, string> cache = new Dictionary<MethodBase, string>(); 
static void Method1<T>(T g) 
{ 
    MethodBase m1 = MethodBase.GetCurrentMethod(); 
    cache[m1] = "m1:" + typeof(T); 
} 

Итак, я переопределил IEqualityComparer, чтобы сравнить аргумент MethodBase по аргументу. И во время отладки я задавался вопросом, что нет способа обнаружить реальный тип аргумента generic-метода, ни GetGenericArguments, ни GetParameters не предоставляют реальный тип вызова. Я прав? Если это так, я не вижу другого способа, чем сравнивать по первой строке Environment.StackTrace - потому что только этот метод исследует тип аргумента.

+0

Предлагаю такое же решение, как здесь: http://stackoverflow.com/a/19118345/2042090 –

ответ

0

Я не думаю, что StackTrace поможет вам: я не предоставляю информацию о фактических типах, с которыми был вызван generic. Наиболее разумным решением для меня является создание собственного класса, который будет хранить информацию об общих параметрах и заполнять его в общих методах.

что-то вроде:

статической силы Method1 (Т г) { Помощник m1 = новый помощник (T.GetType()); cache [m1] = "m1:" + typeof (T); }

1

Поскольку универсальный метод имеет только одну методологическую базу, нет способа делать то, что вы хотите. Вам понадобится использовать какой-либо другой тип в качестве ключа к вашему словарю, если вам нужна эта функциональность, поскольку только MethodBase не содержит аргументов типа при вызове общего метода.