Лучший способ вызвать универсальный метод несколько раз (тип возврата во время выполнения), используя безопасный для параметров вызов - PullRequest
1 голос
/ 21 сентября 2009

Мне кажется, я так близок к тому, чтобы разобраться с этим и прочитал десятки статей и существующих вопросов.

У меня есть такой метод:

public T DoStuff(object arg1, object arg2)
{
  /* Do stuff and return a T */
}

И мне нужно иметь возможность передать этот метод другому классу для целей обратного вызова.
Однако, когда этот другой класс перезванивает, он будет делать это с другим ожидаемым типом возврата, который известен только во время выполнения.

например:.

public void SomeMethod(MethodInfo m, ref object caller)
{
  MethodInfo callback = m.MakeGenericMethod(new Type[] { runtimeType });
  callback.Invoke(caller, new [] { arg1val, arg2val });
}

/* DoStuff() will make a call to SomeMethod() passing 
 * itself (the method and the object) */

Однако вместо этого я хотел бы иметь возможность

  1. Передача SomeMethod только одного объекта обратного вызова (то есть делегата или Func <>).
  2. Уметь изменять этот объект соответствующим образом для общего вызова.
  3. Иметь типобезопасные параметры для вызова, как я бы сделал с делегатом / Func <>.

Я нашел подходы, которые подходят для каждого из них в отдельности, но ни один не охватывает все из них.

Возможно ли это?

1 Ответ

5 голосов
/ 21 сентября 2009

Из использования MakeGenericMethod я предполагаю, что метод (в вашем примере) является общим в T:

public T DoStuff<T>(object arg1, object arg2)

Учитывая количество размышлений, которые вы делаете, это просто не оказывает вам никакой пользы; для использования с отражением вы также можете использовать:

public object DoStuff(Type type, object arg1, object arg2)

И использовать (например) Activator.CreateInstance(type) для создания экземпляра. Вышеуказанное можно теперь использовать с делегатом; например Func<Type,object,object,object>.

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