Здравствуйте, 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);
А можно еще нескромный вопрос.
Это для статических методов. А как для объектов?