Если вы знаете сигнатуры (то есть тип и параметры возврата), тогда Delegate.CreateDelegate
может быть очень эффективно использовано здесь:
using System;
using System.Reflection;
class Test
{
public string Foo(int i)
{
return i.ToString();
}
static void Main()
{
MethodInfo method = typeof(Test).GetMethod("Foo");
Func<Test, int, string> func = (Func<Test, int, string>)
Delegate.CreateDelegate(typeof(Func<Test, int, string>), null, method);
Test t = new Test();
string s = func(t, 123);
}
}
Обратите внимание, что для свойств, вы хотите посмотреть GetGetMethod
и GetSetMethod
. Это не так хорошо работает, если вы не знаете подпись, так как DynamicInvoke
очень медленно.
Чтобы получить выгоду от Delegate.CreateDelegate
, вы должны кэшировать и повторно использовать экземпляр делегата; не воссоздай его каждый раз!
Для свойств, даже если вы не знаете тип свойства, возможно, рассмотрите HyperDescriptor (вам нужно добавить 1 строку для включения гипердескриптора):
using System.ComponentModel;
class Test
{
public int Bar { get; set; }
static void Main()
{
PropertyDescriptor prop = TypeDescriptor.GetProperties(
typeof(Test))["Bar"];
Test t = new Test();
t.Bar = 123;
object val = prop.GetValue(t);
}
}