public virtual object Invoke(object target, params object[] args)
{
switch (Kind)
{
case InvocationKind.Constructor:
return Dynamic.InvokeConstructor((Type)target, args);
case InvocationKind.Convert:
bool tExplict = false;
if (Args.Length == 2)
tExplict = (bool)args[1];
return Dynamic.InvokeConvert(target, (Type)args[0], tExplict);
case InvocationKind.Get:
return Dynamic.InvokeGet(target, Name.Name);
case InvocationKind.Set:
Dynamic.InvokeSet(target, Name.Name, args.FirstOrDefault());
return null;
case InvocationKind.GetIndex:
return Dynamic.InvokeGetIndex(target, args);
case InvocationKind.SetIndex:
Dynamic.InvokeSetIndex(target, args);
return null;
case InvocationKind.InvokeMember:
return Dynamic.InvokeMember(target, Name, args);
case InvocationKind.InvokeMemberAction:
Dynamic.InvokeMemberAction(target, Name, args);
return null;
case InvocationKind.InvokeMemberUnknown:
{
try
{
return Dynamic.InvokeMember(target, Name, args);
}
catch (RuntimeBinderException)
{
Dynamic.InvokeMemberAction(target, Name, args);
return null;
}
}
case InvocationKind.Invoke:
return Dynamic.Invoke(target, args);
case InvocationKind.InvokeAction:
Dynamic.InvokeAction(target, args);
return null;
case InvocationKind.InvokeUnknown:
{
try
{
return Dynamic.Invoke(target, args);
}
catch (RuntimeBinderException)
{
Dynamic.InvokeAction(target, args);
return null;
}
}
case InvocationKind.AddAssign:
Dynamic.InvokeAddAssignMember(target, Name.Name, args.FirstOrDefault());
return null;
case InvocationKind.SubtractAssign:
Dynamic.InvokeSubtractAssignMember(target, Name.Name, args.FirstOrDefault());
return null;
case InvocationKind.IsEvent:
return Dynamic.InvokeIsEvent(target, Name.Name);
default:
throw new InvalidOperationException("Unknown Invocation Kind: " + Kind);
}
}