Re[12]: Новости C#13. params
От: _FRED_ Черногория
Дата: 04.07.24 09:58
Оценка: 7 (1) +1
Здравствуйте, 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));
        }
    }

и делайте так же.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.