Использование обобщений и methodinfo - PullRequest
0 голосов
/ 12 января 2009

Я создаю базовый профилировщик для проекта с открытым исходным кодом. Одним из требований является измерение времени выполнения метода. Хотя это достаточно просто, я должен сделать это, не зная метод или содержащий его класс до времени выполнения. Способ вызова профилировщика будет, когда пользователь вызовет профилировщик из IDE в активном документе. Таким образом, если class1 открыт, и пользователь щелкает правой кнопкой мыши на пустом месте в документе, выбирает профиль, тогда и только тогда класс известен.

У меня есть этот код для использования MethodInfo:

MethodInfo methodInfo = typeof(t).GetMethod(s);

T - это просто держатель общего типа (класс X, где T: class, является сигнатурой класса). s это просто строка имени метода.

У меня есть эта ошибка, однако:

Ожидается имя типа, но найдено имя параметра.

Содержащий метод этой строки кода имеет t в качестве параметра типа T, но его удаление не решает проблему. T - это просто объект, и если я предоставлю имя объекта, например, имя класса, ошибки не будет.

Что дает?

РЕДАКТИРОВАТЬ: Может быть, активатор может решить эту проблему.

Кроме того, можно ли использовать предложение where, чтобы ограничить T только статическим классом?

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 января 2009

Ошибка вызвана тем, что 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
}

Также нет способа ограничить параметр типа статическим классом. Я не уверен, какое это будет использование, поскольку у вас не может быть его экземпляра, и он не сможет реализовать интерфейсы, которые вы можете использовать в универсальном методе.

1 голос
/ 12 января 2009

Может быть, вам нужно

t.GetType().GetMethod(s)
0 голосов
/ 12 января 2009
public void DoSomething(object obj, string methodName)
{
  MethodInfo method = obj.GetType().GetMethod(methodName);
  // Do stuff
}

Это добилось цели (так же, как 2 сообщения выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...