public void Initialize <T>(ref T value) { lock (messageUtilsLock) { object obj = (object)value; Type t = typeof(T); marshaler.EnterContext(); foreach (FieldInfo field in t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { Type ft = field.FieldType; if (ft.IsEnum) { bool exclusive = !MarshalingDescriptor.HasAttribute(ft, typeof(FlagsAttribute)); if (exclusive) { FieldInfo[] df = ft.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (df != null && df.Length > 0) { field.SetValue(obj, df[0].GetRawConstantValue()); } } } else if (ft.IsArray) { int size, length; marshaler.GetAdvocatedSize(new MarshalingDescriptor(ft, field), out size, out length); if (size >= 0) { if (ft.IsArray) { field.SetValue(obj, Array.CreateInstance(ft.GetElementType(), size)); } else { field.SetValue(obj, CreateSequence(ft.GetGenericArguments()[0], size)); } } } marshaler.DefineSymbol(field.Name, field.GetValue(obj)); } marshaler.ExitContext(); List <MethodInfo> ms; if (initializers.TryGetValue(t, out (ms))) { foreach (MethodInfo m in ms) { object[] args = new object[] { obj }; m.Invoke(this, args); obj = args[0]; } } value = (T)obj; } }