Potrzebuję metody, która pobiera instancję MethodInfo
reprezentującą nietypową metodę statyczną z dowolną sygnaturą i zwraca delegata powiązanego z tą metodą, która może później zostać wywołana przy użyciu metody Delegate.DynamicInvoke
. Moja pierwsza naiwna próba wyglądała tak:Jak utworzyć delegata z MethodInfo, gdy podpis metody nie może być wcześniej znany?
using System;
using System.Reflection;
class Program
{
static void Main()
{
var method = CreateDelegate(typeof (Console).GetMethod("WriteLine", new[] {typeof (string)}));
method.DynamicInvoke("Hello world");
}
static Delegate CreateDelegate(MethodInfo method)
{
if (method == null)
{
throw new ArgumentNullException("method");
}
if (!method.IsStatic)
{
throw new ArgumentNullException("method", "The provided method is not static.");
}
if (method.ContainsGenericParameters)
{
throw new ArgumentException("The provided method contains unassigned generic type parameters.");
}
return method.CreateDelegate(typeof(Delegate)); // This does not work: System.ArgumentException: Type must derive from Delegate.
}
}
Mam nadzieję, że metoda MethodInfo.CreateDelegate
mógł dowiedzieć się prawidłową sam typ delegata. Cóż, oczywiście nie może. Jak utworzyć instancję System.Type
reprezentującą delegata z sygnaturą zgodną z podaną instancją MethodInfo
?
Dlaczego chcesz stworzyć delegata i użyć DynamicInvoke? Korzystanie z DynamicInvoke jest dużo wolniejsze niż MethodInfo.Invoke. –
@Nawfal Nope. Kopia wymaga, aby na pytanie zadane tutaj można było odpowiedzieć w zadanym przez Ciebie pytaniu. Pytający chce móc użyć 'MethodInfo.CreateDelegate()', gdy typ reprezentujący sygnaturę metody nie jest znany. W drugim pytaniu jest to już znane jako 'MyDelegate', a zatem nie jest pomocne dla problemu tego pytającego. – einsteinsci
Kto do cholery usuwa moje komentarze? Nie pierwszy raz! Sorry @einsteinsci Nie mogę znaleźć wątku, który opublikowałem jako duplikat, więc nie mogę go sprawdzić. Jeśli mógłbyś opublikować, docenię. – nawfal