// --------------------------- // --------------------------- // --------------------------- // --------------------------- #region analysis logic /// <summary> /// Returns Value=null if this type does not apply. /// </summary> static Contains <ParametricConstructorDescriptor> AnalyseClassType(Type t) { if (!TypeEx.IsEnum(t) && !_InvalidatedTypes.Contains(t)) { bool AvoidDefaultConstructor = true; // Never uses a default constructor. BindingFlags[] bflags = new BindingFlags[2] { BindingFlags.Public | BindingFlags.Instance, BindingFlags.NonPublic | BindingFlags.Instance }; // 2 passes: one with public constructors, and one with private constructors. for (int iflags = 0; iflags < 2; iflags++) { var cs = t.GetConstructors(bflags[iflags]).Where((ci) => AvoidDefaultConstructor ? ci.GetParameters().Length != 0 : true); ConstructorInfo cons; var mf = AnalyseConstructors(cs, out cons); if (mf != null) { return(ParametricConstructorDescriptor.CreateDirectTypeParamDescriptor(cons, mf.ToArray())); } } } return(new Contains <ParametricConstructorDescriptor>(null)); // This type does not apply. }
internal static object[] GetParameterFields(object o, ParametricConstructorDescriptor d) { var cons = d.constructorInfo; var fields = d.ParameterFields; var parameters = cons.GetParameters(); object[] ret = new object[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { var field = fields[i]; ret[i] = field.GetValue(o); } return(ret); }