in ClearScript/Util/DynamicHelpers.cs [39:126]
public static bool TryBindAndInvoke(DynamicMetaObjectBinder binder, object target, object[] args, out object result)
{
try
{
// For COM member access, use IReflect/IExpando if possible. This works around
// some dynamic binder bugs and limitations observed during batch test runs.
if ((target is IReflect reflect) && reflect.GetType().IsCOMObject)
{
if (binder is GetMemberBinder getMemberBinder)
{
if (TryGetProperty(reflect, getMemberBinder.Name, getMemberBinder.IgnoreCase, args, out result))
{
return true;
}
}
else
{
if (binder is SetMemberBinder setMemberBinder)
{
if (TrySetProperty(reflect, setMemberBinder.Name, setMemberBinder.IgnoreCase, args, out result))
{
return true;
}
}
else
{
if (binder is CreateInstanceBinder)
{
if (TryCreateInstance(reflect, args, out result))
{
return true;
}
}
else
{
if (binder is InvokeBinder)
{
if (TryInvoke(reflect, args, out result))
{
return true;
}
}
else
{
if (binder is InvokeMemberBinder invokeMemberBinder)
{
if (TryInvokeMethod(reflect, invokeMemberBinder.Name, invokeMemberBinder.IgnoreCase, args, out result))
{
return true;
}
}
else if ((args != null) && (args.Length > 0))
{
if (binder is GetIndexBinder)
{
if (TryGetProperty(reflect, args[0].ToString(), false, args.Skip(1).ToArray(), out result))
{
return true;
}
}
else
{
if (binder is SetIndexBinder)
{
if (TrySetProperty(reflect, args[0].ToString(), false, args.Skip(1).ToArray(), out result))
{
return true;
}
}
}
}
}
}
}
}
}
var binding = Bind(binder, target, args);
result = Invoke(binding.Expression);
return true;
}
catch (Exception exception)
{
result = exception;
return false;
}
}