Определить общие параметры MethodBase - PullRequest
1 голос
/ 21 декабря 2009

Этот вопрос является продолжением Как отличить MethodBase в генериках

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

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 с аргументом. И во время отладки меня удивило, что нет способа обнаружить реальный тип аргумента универсального метода, ни GetGenericArguments, ни GetParameters не предоставляют реальный тип вызова. Я прав? Если это так, я не вижу другого пути, кроме сравнения по первой строке Environment.StackTrace - потому что только этот метод исследует тип аргумента.

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

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

0 голосов
/ 21 декабря 2009

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

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

статическая пустота Метод 1 (T г) { Помощник m1 = новый Помощник (T.GetType ()); кэш [m1] = "m1:" + typeof (T); }

...