コード例 #1
0
            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));
            }