public object CreateFunction(Type targetType, IGenericCombiner combiner) { if(IsSimplyStruct(targetType)) return BuildToolkit.CreateForwardCombiner(targetType); object result = null; result = BuildToolkit.TryCreateRecursiveNullableCombiner(targetType, combiner); if(result != null) return result; result = BuildToolkit.TryCreateCollectionCombiner(targetType); if(result != null) return result; var builder = new ComplexFunctionBuilder(targetType, combiner); result = builder.Compile(); if(result != null) return result; return BuildToolkit.CreateForwardCombiner(targetType); }
private static object tryCreateComplexCombiner(Type targetType) { try { var builder = new ComplexFunctionBuilder(targetType); foreach (var fi in targetType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) { builder.Add(fi); } foreach (var pi in targetType.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) { builder.Add(pi); } return(builder.Compile()); } catch (Exception ex) { throw new InvalidOperationException(string.Format("can't create combiner for type {0}", targetType.FullName), ex); } }