Re[9]: Приоритет вызова перегруженных методов
От: Sinix  
Дата: 08.06.16 06:16
Оценка: 15 (2) +1
Здравствуйте, Serginio1, Вы писали:

S> Не читаешь ты. Прежде чем отправить в натив объект сохраняется в статическом массиве массиве. Жить он будет пока его из массива не удалят.

Ну, т.е. как и говорил, получаем или утечку объектов на managed-стороне, или адскую магию с рефкаунтингом (по, сути, переизобретение IUnknown).
Для сложных графов с изменяемыми свойствами-объектами тесты как минимум надо сделать

S>>Вообще-то неизвестна, в рантайме определяется. Достаточно только набора значений.

S> DLR то как раз статический. Но он мне все равно нужен для использования DynamicObject

Вот народ я с вас фигею. Вам дают карту с сокровищами, а вы требуете чтоб вас экспрессом минуя все три тома приключений доставили прямо в термал спа "Золотое кольцо" (магнитик на холодильник с Балрогом в подарок). Где ваша это... мазохизм? Стремление усложнить жизнь? Граблефилия? А, авантюризм, во!

Держите, скучный вы человек:
        private static CallSite<Action<CallSite, Type, object, object>> callSite;

        static void Main(string[] args)
        {
            CallADynamic(1, 2);
            CallADynamic(null, null);
            CallADynamic(null, new object());
        }

        private static void CallADynamic(params object[] data)
        {
            if (callSite == null)
            {
                callSite =
                    CallSite<Action<CallSite, Type, object, object>>.Create(
                        Binder.InvokeMember(
                            CSharpBinderFlags.ResultDiscarded,
                            "CallA", null, typeof(Program), new CSharpArgumentInfo[]
                            {
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
                            }));
            }
            callSite.Target(callSite, typeof(Program), data[0], data[1]);
        }

        static void CallA(params int[] args)
        {
            Console.WriteLine("params");
        }

        static void CallA(object a, object b)
        {
            Console.WriteLine("objects");
        }

        static void CallA(object a, string b)
        {
            Console.WriteLine("object+string");
        }


Как допилить до вызова произвольного метода — сами-сами. Иначе вообще никакого удовольствия не будет.

  P.S.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.