public T Strategy(T source, T destination, CloneContext cloneContext) { Type sourceType = source.GetType(); if (sourceType == typeof(TConcrete)) { var s = (TConcrete)(object)source; var d = destination is TConcrete ? (TConcrete)(object)destination : default(TConcrete); if (_ReferenceTypeDynamicStrategy == null) { _ReferenceTypeDynamicStrategy = Cloneable <TConcrete> .BuildDynamicStrategy(); } return((T)(object)_ReferenceTypeDynamicStrategy(s, d, cloneContext)); } if (_NextStrategy == null) { var interfaceStrategyType = typeof(ReferenceTypeStrategy <>).MakeGenericType(TargetType, sourceType); var interfaceStrategy = Activator.CreateInstance(interfaceStrategyType); _NextStrategy = interfaceStrategy.GetDelegate <Func <T, T, CloneContext, T> >("Strategy"); } return(_NextStrategy(source, destination, cloneContext)); }