예제 #1
0
        /// <summary>
        /// 创建随机对象
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        internal static T CreateNotNull(Config config)
        {
            if (defaultCreator != null)
            {
                return(defaultCreator());
            }
            if (configNullCreator != null)
            {
                return(configNullCreator(config));
            }
            if (DefaultConstructor <T> .Type == AutoCSer.Metadata.DefaultConstructorType.None)
            {
                return(default(T));
            }
            if (isValueType)
            {
                T value = DefaultConstructor <T> .Constructor();

                MemberCreator(ref value, config);
                return(value);
            }
            else
            {
                object historyValue = config.TryGetValue(typeof(T));
                if (historyValue != null)
                {
                    return((T)historyValue);
                }
                T value = config.SaveHistory(DefaultConstructor <T> .Constructor());
                MemberCreator(ref value, config);
                return(value);
            }
        }
예제 #2
0
        /// <summary>
        /// Maintains a set of serializers.
        /// </summary>
        /// <param name="Context">Serialization context.</param>
        public SerializerCollection(ISerializerContext Context)
#endif
        {
            this.context     = Context;
            this.serializers = new Dictionary <Type, IObjectSerializer>();
#if NETSTANDARD1_5
            this.compiled = Compiled;
#endif

            ConstructorInfo   DefaultConstructor;
            IObjectSerializer S;
            TypeInfo          TI;

            foreach (Type T in Types.GetTypesImplementingInterface(typeof(IObjectSerializer)))
            {
                TI = T.GetTypeInfo();
                if (TI.IsAbstract || TI.IsGenericTypeDefinition)
                {
                    continue;
                }

                DefaultConstructor = null;

                try
                {
                    foreach (ConstructorInfo CI in TI.DeclaredConstructors)
                    {
                        if (CI.IsPublic && CI.GetParameters().Length == 0)
                        {
                            DefaultConstructor = CI;
                            break;
                        }
                    }

                    if (DefaultConstructor is null)
                    {
                        continue;
                    }

                    S = DefaultConstructor.Invoke(Types.NoParameters) as IObjectSerializer;
                    if (S is null)
                    {
                        continue;
                    }
                }
                catch (Exception)
                {
                    continue;
                }

                this.serializers[S.ValueType] = S;
            }

            this.serializers[typeof(GenericObject)] = new GenericObjectSerializer(this.context, false);
            this.serializers[typeof(object)]        = new GenericObjectSerializer(this.context, true);
        }
예제 #3
0
        public void CreateDefaultConstructor()
        {
            if (Members.Any(m => m is ConstructorDeclarationSyntax))
            {
                return;
            }
            var metatype    = (Metatype)Type.Resolved();
            var constructor = new DefaultConstructor((ObjectType)metatype.Instance);

            ChildSymbols = new SymbolSet(ChildSymbols.Values.SelectMany(s => s).Append(constructor));
        }
예제 #4
0
        private static object TryClone(object obj)
        {
            if (obj == null)
            {
                return(null);
            }
            var type = obj.GetType();

            if (obj is IList list)
            {
                if (type.IsArray)
                {
                    var ret = Array.CreateInstance(type.GetElementType(), list.Count);
                    Array.Copy((Array)list, 0, ret, 0, list.Count);
                    return(ret);
                }

                if (list is ExpandableList e)
                {
                    return(e.Expand());
                }

                if (type.GetGenericTypeDefinition() == typeof(List <>))
                {
                    var ret = (IList)DefaultConstructor.Activator(type)();
                    foreach (var o in list)
                    {
                        ret.Add(o);
                    }

                    return(ret);
                }

                throw new Exception($"Unable to clone {type.FullName} from IList");
            }

            if (obj is IDictionary dict)
            {
                var ret = (IDictionary)DefaultConstructor.Activator(type)();
                foreach (DictionaryEntry entry in dict)
                {
                    ret.Add(entry.Key, entry.Value);
                }

                return(ret);
            }

            return(obj);
        }
예제 #5
0
        /// <summary>
        /// 创建随机对象
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        public static T Create(Config config = null)
        {
            if (defaultCreator != null)
            {
                return(defaultCreator());
            }
            if (configCreator != null)
            {
                if (config == null)
                {
                    config = Config.Default;
                }
                if (config.History == null)
                {
                    return(configCreator(config));
                }
                try
                {
                    return(configCreator(config));
                }
                finally { config.History.Clear(); }
            }
            if (DefaultConstructor <T> .Type == DefaultConstructorType.None)
            {
                return(default(T));
            }
            T value = DefaultConstructor <T> .Constructor();

            if (config == null)
            {
                config = Config.Default;
            }
            if (config.History == null)
            {
                MemberCreator(ref value, config);
            }
            else
            {
                try
                {
                    MemberCreator(ref value, config);
                }
                finally { config.History.Clear(); }
            }
            return(value);
        }
        private static bool Test_SearchKnuthMorrisPratt_Stub0001(string a, string b)
        {
            var r0 = a.IndexOf(b);
            var r1 = (int?)null;
            var a1 = a.AsReadOnlyList();
            var b1 = b.AsReadOnlyList();

            try {
                r1 = SequenceSearchModule.IndexOf_A_KnuthMorrisPratt <char, StandardStringAsReadOnlyList, StandardStringAsReadOnlyList, CharComparer>(a1, b1, DefaultConstructor.Invoke <CharComparer>());
            } catch (Exception) {
            }
            return(r0 == r1);
        }
예제 #7
0
        public void Test_01_DefaultConstructor()
        {
            DefaultConstructor Obj = Types.Instantiate <DefaultConstructor>(false);

            Assert.IsNotNull(Obj);
        }