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); }
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); }
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); }