Re[14]: Приоритет вызова перегруженных методов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.06.16 09:40
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>>Угу. Но нагенерить конечное количество не проблема как бы, достаточно прошвырнуться по GetMethods().

S>> У меня обертка не для одного типа, а для вех возможных типов, о которых я не знаю на этапе компиляции.
S>В рантайме нагенерить. Ну блин, не заставляйте меня совсем всё разжёвывать, так неинтересно.

Значит я могу нагенерировать методы

public static CallSite<Func<CallSite, Type, object, object, object>>  CallADynamic2Params(string MethodName)
        {
            
             var   res =
                    CallSite<Func<CallSite, Type, object, object, object>>.Create(
                        Binder.InvokeMember(
                            CSharpBinderFlags.ResultDiscarded,
                            MethodName,null, typeof(Program),  new CSharpArgumentInfo[]
                            {
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
                            }));

            return res;
        }

        public static object CallFor2Param(Type type, object DynamicCalSite, params object[] data)
        {
            var cS = (CallSite<Func<CallSite, Type, object, object, object>>)DynamicCalSite;
            return cS.Target(cS, type, data[0], data[1]);


        }



Сохранять CallSite для типа по имени и количеству параметров.

и вызывать


var callSite = DynamicCall.CallADynamic2Params("CallA");

            DynamicCall.CallFor2Param(typeof(DynamicCall),callSite,1, 2);
            DynamicCall.CallFor2Param(typeof(DynamicCall), callSite, null, null);
            DynamicCall.CallFor2Param(typeof(DynamicCall), callSite, null, new object());

            double d = 78;
            var obj1 = DynamicCall.CallFor2Param(typeof(DynamicCall), callSite, 1, d);



А можно еще нескромный вопрос.
Это для статических методов. А как для объектов?
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.