in ClearScript/HostItem.cs [1532:1628]
private object SetHostProperty(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, CultureInfo culture)
{
if (name == SpecialMemberNames.Default)
{
if (args.Length < 1)
{
throw new InvalidOperationException("Invalid argument count");
}
object result;
var defaultProperty = Target.Type.GetScriptableDefaultProperty(invokeFlags, bindArgs.Take(bindArgs.Length - 1).ToArray(), AccessContext, DefaultAccess);
if (defaultProperty != null)
{
return SetHostProperty(defaultProperty, invokeFlags, args, bindArgs, culture);
}
if (args.Length < 2)
{
throw new InvalidOperationException("Invalid argument count");
}
if (TargetDynamicMetaObject != null)
{
if (TargetDynamicMetaObject.TrySetIndex(args.Take(args.Length - 1).ToArray(), args[args.Length - 1], out result))
{
return result;
}
}
// special case to enable JScript/VBScript "x(a) = b" syntax when x is a host indexed property
if (InvokeHelpers.TryInvokeObject(this, Target, invokeFlags, args, bindArgs, false, out result))
{
return result;
}
throw new InvalidOperationException("Invalid property assignment");
}
if ((TargetDynamicMetaObject != null) && (args.Length == 1))
{
if (TargetDynamicMetaObject.TrySetMember(name, args[0], out var result))
{
return result;
}
if (int.TryParse(name, NumberStyles.Integer, CultureInfo.InvariantCulture, out var index))
{
if (TargetDynamicMetaObject.TrySetIndex(new object[] { index }, args[0], out result))
{
return result;
}
}
if (TargetDynamicMetaObject.TrySetIndex(new object[] { name }, args[0], out result))
{
return result;
}
}
if (args.Length < 1)
{
throw new InvalidOperationException("Invalid argument count");
}
var property = Target.Type.GetScriptableProperty(name, invokeFlags, bindArgs.Take(bindArgs.Length - 1).ToArray(), AccessContext, DefaultAccess);
if (property != null)
{
return SetHostProperty(property, invokeFlags, args, bindArgs, culture);
}
var field = Target.Type.GetScriptableField(name, invokeFlags, AccessContext, DefaultAccess);
if (field != null)
{
if (args.Length == 1)
{
if (field.IsLiteral || field.IsInitOnly || field.IsReadOnlyForScript(DefaultAccess))
{
throw new UnauthorizedAccessException("Field is read-only");
}
var value = args[0];
if (field.FieldType.IsAssignableFrom(ref value))
{
field.SetValue(Target.InvokeTarget, value);
return value;
}
throw new ArgumentException("Invalid field assignment");
}
throw new InvalidOperationException("Invalid argument count");
}
throw new MissingMemberException(MiscHelpers.FormatInvariant("The object has no suitable property or field named '{0}'", name));
}