Пример #1
0
        public static DynamicMethodSchema GetMethodSchema(ConditionSchema schema)
        {
            DynamicMethodSchema methodSchema = new DynamicMethodSchema();
            var argumentTypeList             = new List <Type>();
            var additionalReferencedTypes    = new List <Type>();

            argumentTypeList.Add(schema.targetSchema.propertyType);
            if (schema.targetSchema.propertySequence.Last().propertyType != null)
            {
                additionalReferencedTypes.Add(schema.targetSchema.propertySequence.Last().propertyType);
            }
            foreach (var x in schema.argumentSchemata)
            {
                if (x.primitiveType == PrimitiveType.NonPrimitive)
                {
                    argumentTypeList.Add(x.propertyType);
                    if (x.propertySequence.Length > 0 && x.propertySequence.Last().propertyType != null)
                    {
                        additionalReferencedTypes.Add(x.propertySequence.Last().propertyType);
                    }
                }
            }
            methodSchema.argumentData = argumentTypeList.ToArray();
            methodSchema.additionalReferencedTypes = additionalReferencedTypes.ToArray();
            methodSchema.returnType = typeof(bool).AssemblyQualifiedName;
            methodSchema.methodBody = DynamicCodeFragmentGenerator.GetMethodBodyFromConditionSchema(schema);
            return(methodSchema);
        }
Пример #2
0
        public IEnumerable <ICondition> BuildAll(ConditionSchema[] schemata)
        {
            var watch            = Stopwatch.StartNew();
            var dict             = GetMethodSchemaDictionary(schemata).ToArray();
            var methodInfo       = DynamicCodeFragmentGenerator.GetGeneratedMethods(dict.Select(x => x.Value).ToArray());
            var methodDictionary = new Dictionary <Guid, MethodInfo>();

            for (int i = 0; i < methodInfo.Length; i++)
            {
                methodDictionary.Add(dict[i].Key, methodInfo[i]);
            }

            var retVal = BuildAll(schemata, methodDictionary);

            watch.Stop();
            Console.WriteLine("Build time: " + watch.ElapsedMilliseconds);
            return(retVal);
        }
Пример #3
0
        public void MutualExclusionAsyncTest()
        {
            DynamicCodeFragmentGenerator.CalculateAndStoreHashes(new DynamicMethodSchema[] { new DynamicMethodSchema() });
            int dynamicCacheHits   = DynamicCodeFragmentGenerator.cacheHits;
            int dynamicCacheMisses = DynamicCodeFragmentGenerator.cacheMisses;
            var ret = TaskRunner();

            ret.Wait();
            object[]     array = (object[])ret.Result;
            ICondition[] conds = array.Cast <ICondition>().ToArray();
            foreach (var cond in conds)
            {
                Assert.True(cond.Met());
            }
            int endCacheHits   = DynamicCodeFragmentGenerator.cacheHits;
            int endCacheMisses = DynamicCodeFragmentGenerator.cacheMisses;

            Console.Write("Misses: " + endCacheMisses + " " + dynamicCacheMisses);
            Console.Write("Hits: " + endCacheHits + " " + dynamicCacheHits);
            Assert.AreEqual(2, endCacheMisses - dynamicCacheMisses);
            Assert.AreEqual(4, endCacheHits - dynamicCacheHits);
        }