Определить общие параметры MethodBase
Этот вопрос является продолжением Как отличить 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 ответа
Поскольку универсальный метод имеет только одну MethodBase, нет способа сделать то, что вы хотите. Вам понадобится использовать какой-то другой тип в качестве ключа к вашему словарю, если вам нужна эта функциональность, поскольку одна только MethodBase не содержит аргументов типа при вызове универсального метода.
Я не думаю, что StackTrace поможет вам: я не предоставляю информацию о фактических типах, с которыми вызывается generic. Самое разумное решение для меня - создать свой собственный класс, который будет хранить информацию об универсальных параметрах и заполнять ее универсальными методами.
Что-то вроде:
статическая пустота Method1(T g) {Помощник m1 = новый Помощник (T.GetType()); кэш [m1] = "m1:" + typeof(T); }