in ClearScript/HostItem.cs [1176:1355]
private object InvokeHostMember(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, CultureInfo culture, out bool isCacheable)
{
isCacheable = false;
object result;
if (invokeFlags.HasFlag(BindingFlags.CreateInstance))
{
if (name == SpecialMemberNames.Default)
{
if (Target is HostType hostType)
{
var typeArgs = GetTypeArgs(args).Select(HostType.Wrap).ToArray();
if (typeArgs.Length > 0)
{
// ReSharper disable CoVariantArrayConversion
if (hostType.TryInvoke(this, BindingFlags.InvokeMethod, typeArgs, typeArgs, out result))
{
hostType = result as HostType;
if (hostType != null)
{
args = args.Skip(typeArgs.Length).ToArray();
var specificType = hostType.GetSpecificType();
if (typeof(Delegate).IsAssignableFrom(specificType))
{
if (args.Length != 1)
{
throw new InvalidOperationException("Invalid constructor invocation");
}
return DelegateFactory.CreateDelegate(Engine, args[0], specificType);
}
return specificType.CreateInstance(AccessContext, DefaultAccess, args);
}
}
throw new InvalidOperationException("Invalid constructor invocation");
// ReSharper restore CoVariantArrayConversion
}
var type = hostType.GetSpecificType();
if (typeof(Delegate).IsAssignableFrom(type))
{
if (args.Length != 1)
{
throw new InvalidOperationException("Invalid constructor invocation");
}
return DelegateFactory.CreateDelegate(Engine, args[0], type);
}
return type.CreateInstance(AccessContext, DefaultAccess, args);
}
if (TargetDynamicMetaObject != null)
{
if (TargetDynamicMetaObject.TryCreateInstance(args, out result))
{
return result;
}
}
}
throw new InvalidOperationException("Invalid constructor invocation");
}
if (invokeFlags.HasFlag(BindingFlags.InvokeMethod))
{
if (name == SpecialMemberNames.Default)
{
if (InvokeHelpers.TryInvokeObject(this, Target, invokeFlags, args, bindArgs, TargetDynamicMetaObject != null, out result))
{
return result;
}
if (invokeFlags.HasFlag(BindingFlags.GetField))
{
result = GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
if (!(result is Nonexistent))
{
return result;
}
if (args.Length < 1)
{
return Target;
}
if (TargetDynamicMetaObject != null)
{
// dynamic target; don't throw for default indexed property retrieval failure
return result;
}
}
throw new NotSupportedException("The object does not support the requested invocation operation");
}
if (name == SpecialMemberNames.NewEnum)
{
return CreateEnumerator();
}
if (name == SpecialMemberNames.NewAsyncEnum)
{
return CreateAsyncEnumerator();
}
if ((TargetDynamicMetaObject != null) && TargetDynamicMetaObject.HasMember(name, invokeFlags.HasFlag(BindingFlags.IgnoreCase)))
{
if (TargetDynamicMetaObject.TryInvokeMember(this, name, invokeFlags, args, out result))
{
return result;
}
}
if (ThisReflect.GetMethods(GetMethodBindFlags()).Any(method => method.Name == name))
{
// The target appears to have a method with the right name, but it could be an
// extension method that fails to bind. If that happens, we should attempt the
// fallback but throw the original exception if the fallback fails as well.
try
{
return InvokeMethod(name, args, bindArgs);
}
catch (TargetInvocationException)
{
throw;
}
catch (Exception)
{
// ReSharper disable EmptyGeneralCatchClause
try
{
if (invokeFlags.HasFlag(BindingFlags.GetField))
{
return GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
}
}
catch (TargetInvocationException)
{
throw;
}
catch (Exception)
{
}
throw;
// ReSharper restore EmptyGeneralCatchClause
}
}
if (invokeFlags.HasFlag(BindingFlags.GetField))
{
return GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
}
throw new MissingMemberException(MiscHelpers.FormatInvariant("The object has no suitable method named '{0}'", name));
}
if (invokeFlags.HasFlag(BindingFlags.GetField))
{
return GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
}
if (invokeFlags.HasFlag(BindingFlags.SetField))
{
return SetHostProperty(name, invokeFlags, args, bindArgs, culture);
}
throw new InvalidOperationException("Invalid member invocation mode");
}