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);
        }
Example #2
0
        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);
            }
        }