public sealed override void SetFieldDirect(TypedReference typedReference, object value) { if (RuntimeAugments.IsValueType(this.DeclaringTypeHandle)) { // We're being asked to store a field into the value type pointed to by the TypedReference. This code path // bypasses boxing that value type by adding this field's offset to the TypedReference's managed pointer. // (Otherwise, the store would go into a useless temporary copy rather than the intended destination.) Type targetType = TypedReference.GetTargetType(typedReference); if (!(targetType.TypeHandle.Equals(this.DeclaringTypeHandle))) { throw new ArgumentException(); } value = RuntimeAugments.CheckArgumentForDirectFieldAccess(value, this.FieldTypeHandle); UncheckedSetFieldDirectIntoValueType(typedReference, value); } else { // We're being asked to store a field from a reference type. There's no boxing to bypass in that case so just handle it as // if this was a FieldInfo.SetValue() call (but using SetValueDirect's argument coercing semantics) object obj = TypedReference.ToObject(typedReference); if (obj == null) { throw new TargetException(SR.RFLCT_Targ_StatFldReqTarg); } if (!RuntimeAugments.IsAssignable(obj, this.DeclaringTypeHandle)) { throw new ArgumentException(); } value = RuntimeAugments.CheckArgumentForDirectFieldAccess(value, this.FieldTypeHandle); UncheckedSetField(obj, value); } }
protected sealed override void SetFieldDirectBypassCctor(object value) { value = RuntimeAugments.CheckArgumentForDirectFieldAccess(value, FieldTypeHandle); if (IsFieldInitOnly) { throw new FieldAccessException(SR.Acc_InitOnlyStatic); } UncheckedSetFieldBypassCctor(value); }
protected sealed override void SetFieldDirectBypassCctor(object value) { value = RuntimeAugments.CheckArgumentForDirectFieldAccess(value, FieldTypeHandle); UncheckedSetFieldBypassCctor(value); }