Здравствуйте, Serginio1, Вы писали:
_FR>> public class Foo2
_FR>> {
_FR>> public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b);
_FR>> }
S> Но пишем то мы универсальный код. Конечно можно динамически скомпилировать.
S>В той же статье для эвентов генерируется и компилируется код.
S> Но геморроя добавляется.
Так
посмотрите во что компилятор это превращает:
public class Foo2
{
[CompilerGenerated]
private static class <>o__0
{
public static CallSite<Func<CallSite, Foo, object, object, object>> <>p__0;
public static CallSite<Func<CallSite, object, string>> <>p__1;
}
[NullableContext(1)]
public static string bar(Foo foo, [Dynamic] object a, [Dynamic] object b)
{
if (<>o__0.<>p__1 == null)
{
<>o__0.<>p__1 = CallSite<Func<CallSite, object, string>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(Foo2)));
}
Func<CallSite, object, string> target = <>o__0.<>p__1.Target;
CallSite<Func<CallSite, object, string>> <>p__ = <>o__0.<>p__1;
if (<>o__0.<>p__0 == null)
{
Type typeFromHandle = typeof(Foo2);
CSharpArgumentInfo[] array = new CSharpArgumentInfo[3];
array[0] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null);
array[1] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
array[2] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
<>o__0.<>p__0 = CallSite<Func<CallSite, Foo, object, object, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember(CSharpBinderFlags.None, "bar", null, typeFromHandle, array));
}
return target(<>p__, <>o__0.<>p__0.Target(<>o__0.<>p__0, foo, a, b));
}
}
и делайте так же.