Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ MakeTypedReference()

static unsafe TypedReference System.TypedReference.MakeTypedReference ( object target,
FieldInfo[] flds )
inlinestatic

Definition at line 28 of file TypedReference.cs.

29 {
30 if (target == null)
31 {
32 throw new ArgumentNullException("target");
33 }
34 if (flds == null)
35 {
36 throw new ArgumentNullException("flds");
37 }
38 if (flds.Length == 0)
39 {
40 throw new ArgumentException(SR.Arg_ArrayZeroError, "flds");
41 }
42 IntPtr[] array = new IntPtr[flds.Length];
43 RuntimeType runtimeType = (RuntimeType)target.GetType();
44 for (int i = 0; i < flds.Length; i++)
45 {
46 RuntimeFieldInfo runtimeFieldInfo = flds[i] as RuntimeFieldInfo;
47 if (runtimeFieldInfo == null)
48 {
49 throw new ArgumentException(SR.Argument_MustBeRuntimeFieldInfo);
50 }
51 if (runtimeFieldInfo.IsStatic)
52 {
53 throw new ArgumentException(SR.Format(SR.Argument_TypedReferenceInvalidField, runtimeFieldInfo.Name));
54 }
55 if (runtimeType != runtimeFieldInfo.GetDeclaringTypeInternal() && !runtimeType.IsSubclassOf(runtimeFieldInfo.GetDeclaringTypeInternal()))
56 {
57 throw new MissingMemberException(SR.MissingMemberTypeRef);
58 }
59 RuntimeType runtimeType2 = (RuntimeType)runtimeFieldInfo.FieldType;
60 if (runtimeType2.IsPrimitive)
61 {
62 throw new ArgumentException(SR.Format(SR.Arg_TypeRefPrimitve, runtimeFieldInfo.Name));
63 }
64 if (i < flds.Length - 1 && !runtimeType2.IsValueType)
65 {
66 throw new MissingMemberException(SR.MissingMemberNestErr);
67 }
68 array[i] = runtimeFieldInfo.FieldHandle.Value;
69 runtimeType = runtimeType2;
70 }
71 TypedReference result = default(TypedReference);
72 InternalMakeTypedReference(&result, target, array, runtimeType);
73 return result;
74 }
RuntimeFieldHandle FieldHandle
Definition FieldInfo.cs:45
override bool IsSubclassOf(Type type)
static unsafe void InternalMakeTypedReference(void *result, object target, IntPtr[] flds, RuntimeType lastFieldType)

References System.SR.Arg_ArrayZeroError, System.SR.Arg_TypeRefPrimitve, System.SR.Argument_MustBeRuntimeFieldInfo, System.SR.Argument_TypedReferenceInvalidField, System.array, System.Reflection.FieldInfo.FieldHandle, System.Reflection.FieldInfo.FieldType, System.SR.Format(), System.Reflection.RuntimeFieldInfo.GetDeclaringTypeInternal(), System.TypedReference.InternalMakeTypedReference(), System.Type.IsPrimitive, System.Reflection.FieldInfo.IsStatic, System.RuntimeType.IsSubclassOf(), System.Type.IsValueType, System.SR.MissingMemberNestErr, System.SR.MissingMemberTypeRef, System.Reflection.MemberInfo.Name, and System.RuntimeFieldHandle.Value.

Referenced by System.Runtime.Serialization.ObjectManager.DoValueTypeFixup().