public static object GetDefaultValue(this Type t) { Debug.Assert(t != typeof(void)); return (t.IsPointer ? IntPtr.Zero : t.IsValueType && t != typeof(void) ? MockingUtil.CreateInstance(t) : null); }
public static object CreateObject(this Type type, object[] args) { args = args ?? NoObjects; var constructorInfos = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (constructorInfos.Length == 0 || (type.IsValueType && args.Length == 0)) { if (args.Length > 0) { throw new MockException("Type has no non-default constructors."); } return(type.GetDefaultValue()); } object state; var ctor = (ConstructorInfo)MockingUtil.BindToMethod(MockingUtil.Default, constructorInfos, ref args, null, null, null, out state); var ctorParameters = ctor.GetParameters(); for (int i = 0; i < ctorParameters.Length; ++i) { var paramType = ctorParameters[i].ParameterType; if (paramType.IsValueType && args[i] == null) { args[i] = paramType.GetDefaultValue(); } else if (args[i] != null && !paramType.IsAssignableFrom(args[i].GetType())) { args[i] = Convert.ChangeType(args[i], paramType, System.Globalization.CultureInfo.CurrentCulture); } } #if !PORTABLE var newCall = MockingUtil.CreateDynamicMethod <Func <object[], object> >(il => { il.UnpackArgArray(OpCodes.Ldarg_0, ctor); il.PushArgArray(ctor); il.Emit(OpCodes.Newobj, ctor); if (type.IsValueType) { il.Emit(OpCodes.Box, type); } il.Emit(OpCodes.Ret); }); return(ProfilerInterceptor.GuardExternal(() => { try { return newCall(args); } catch (MemberAccessException ex) { GC.KeepAlive(ex); return MockingUtil.CreateInstance(type, args); } })); #else return(MockingUtil.CreateInstance(type, args)); #endif }