Ho bisogno di un metodo che prende un'istanza MethodInfo
che rappresenta un metodo statico non generico con firma arbitraria e restituisce un delegato associato a quel metodo che potrebbe essere successivamente richiamato utilizzando il metodo Delegate.DynamicInvoke
. Il mio primo tentativo ingenuo si presentava così:Come creare un delegato da un MethodInfo quando la firma del metodo non può essere conosciuta in anticipo?
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.
}
}
ho sperato che il metodo MethodInfo.CreateDelegate
riusciva a capire il tipo delegato corretto se stessa. Beh, ovviamente non può. Quindi, come posso creare un'istanza di System.Type
che rappresenta un delegato con una firma corrispondente all'istanza MethodInfo
fornita?
Perché si vuole creare un delegato e utilizzare DynamicInvoke? L'uso di DynamicInvoke è molto più lento di MethodInfo.Invoke. –
@nawfal Nope. Un duplicato richiede che la domanda posta qui possa essere risolta nella domanda che hai citato. Il richiedente vuole poter usare 'MethodInfo.CreateDelegate()' quando il tipo che rappresenta la firma del metodo non è noto. Nell'altra domanda, questo è già noto come 'MyDelegate', e quindi non è utile al problema di questo asker. – einsteinsci
Chi diavolo sta cancellando i miei commenti? Non è la prima volta! Scusa @ einsteinsci Non riesco a trovare quale thread ho postato qui come duplicato, quindi non posso controllare. Se potessi pubblicare apprezzerò. – nawfal