internal Object InstantiateObject(Type objectType, out Dictionary<string, MemberInfo> memberMap) { if (objectType.IsInterface || objectType.IsAbstract || objectType.IsValueType) { throw new JsonTypeCoercionException( String.Format(TypeCoercionUtility.ErrorCannotInstantiate, objectType.FullName)); } ConstructorInfo ctor = objectType.GetConstructor(Type.EmptyTypes); if (ctor == null) { throw new JsonTypeCoercionException( String.Format(TypeCoercionUtility.ErrorDefaultCtor, objectType.FullName)); } Object result; try { // always try-catch Invoke() to expose real exception result = ctor.Invoke(null); } catch (TargetInvocationException ex) { if (ex.InnerException != null) { throw new JsonTypeCoercionException(ex.InnerException.Message, ex.InnerException); } throw new JsonTypeCoercionException("Error instantiating " + objectType.FullName, ex); } memberMap = GetMemberMap (objectType); return result; }
public static ConstructorInfo GetConstructor (Type type, ConstructorInfo constructor) { /*FIXME I would expect the same checks of GetMethod here*/ if (type == null) throw new ArgumentException ("Type is not generic", "type"); if (!type.IsGenericType) throw new ArgumentException ("Type is not a generic type", "type"); if (type.IsGenericTypeDefinition) throw new ArgumentException ("Type cannot be a generic type definition", "type"); if (constructor == null) throw new NullReferenceException (); //MS raises this instead of an ArgumentNullException if (!constructor.DeclaringType.IsGenericTypeDefinition) throw new ArgumentException ("constructor declaring type is not a generic type definition", "constructor"); if (constructor.DeclaringType != type.GetGenericTypeDefinition ()) throw new ArgumentException ("constructor declaring type is not the generic type definition of type", "constructor"); ConstructorInfo res = type.GetConstructor (constructor); if (res == null) throw new ArgumentException ("constructor not found"); return res; }