Pixel_Guy
@Pixel_Guy
C# программист разрабатывающий игры на unity

Как по MethodInfo выбрать нужную сигнатуру для CreateDelegate?

Есть метод, который получает все методы из сборки с пользовательским атрибутом. Все эти методы должны добавиться в массив делегатов.
Вопрос в том, как выбрать нужную сигнатуру делегата для метода Method.CreateDelegate, если известен только MethodInfo? Дело в том, что на входе все стандартные классы делегатов используют дженерики, а они не могут задаваться во время работы приложения.
Может есть варианты как с помощью метода Type.GetType получить generic вариацию класса? Искал, пока составлял вопрос, но так и не нашел.
Если, что оставляйте свои варианты поиска решений к этому вопросу.
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ответы на вопрос 1
@hovsepyann
Студент YSCI
Если я вас правильно понял, то можете в MethodInfo просто записать имя и модификатор, а параметры и тип возвращаемого значения передать сразу в CreateDelegate. Для этого можете использовать Action или Func.

public static void Main()
	{
		MethodInfo methodInfo = typeof(Program).GetMethod("Method", BindingFlags.Public | BindingFlags.Static);
		Delegate @delegate = Delegate.CreateDelegate(typeof(Action<string>), methodInfo);
		
		@delegate.DynamicInvoke("Test");
	}
	
	public static void Method(string str) => Console.Write(str);


Для не void методов использовать Func:

public static void Main()
	{
		MethodInfo methodInfo = typeof(Program).GetMethod("Method", BindingFlags.Public | BindingFlags.Static);
		Delegate @delegate = Delegate.CreateDelegate(typeof(Func<string, string>), methodInfo);
		
		string text = (string) @delegate.DynamicInvoke("Test");
               Console.WriteLine(text);
	}
	
	public static void Method(string str) =>str;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы