Я создаю базовый профилировщик для проекта с открытым исходным кодом. Одно из требований - измерить время выполнения метода. Хотя это достаточно просто, я должен делать это, не зная метода или содержащего его класса до времени выполнения. Способ вызвать профилировщик будет, когда пользователь вызовет профилировщик из IDE в активном документе. Итак, если class1 открыт, и пользователь щелкает правой кнопкой мыши пробел в документе, выбирает профиль, и только тогда класс известен.
У меня есть этот код для использования MethodInfo:
MethodInfo methodInfo = typeof(t).GetMethod(s);
T - это просто универсальный держатель типа (class X, где T: class - подпись класса). s - это просто строка имени метода.
Однако у меня есть эта ошибка:
Ожидается имя типа, но найдено имя параметра.
Содержащий метод этой строки кода имеет t как параметр типа T, но его удаление не решает проблему. T - это просто объект, и если я предоставлю имя объекта, например имя класса, ошибки не будет.
Что дает?
Обновлено: Может быть, активатор может решить эту проблему.
Кроме того, могу ли я использовать предложение where, чтобы ограничить T только статическим классом?
Спасибо





Может тебе нужно
t.GetType().GetMethod(s)
Ошибка вызвана тем, что typeof ожидает имя типа или параметр, например typeof (int) или typeof (T), где T - параметр типа. Похоже, что t является экземпляром System.Type, поэтому в typeof нет необходимости.
Вам нужен для этого универсальный тип? Это не сработает?
public void DoSomething(object obj, string methodName)
{
MethodInfo method = obj.GetType().GetMethod(methodName);
// Do stuff
}
или же
public void DoSomething(Type t, string methodName)
{
MethodInfo method = t.GetMethod(methodName);
// Do stuff
}
Кроме того, нет способа ограничить параметр типа статическим классом. Я не уверен, что от этого будет, поскольку у вас не может быть его экземпляра, и он не сможет реализовать какие-либо интерфейсы, которые вы можете использовать в универсальном методе.
public void DoSomething(object obj, string methodName)
{
MethodInfo method = obj.GetType().GetMethod(methodName);
// Do stuff
}
Это помогло (то же, что и 2 сообщения выше).
Не могли бы вы показать, как вызывается метод, содержащий эту строку кода?