private Type CreateDynamicClass(DynamicProperty[] properties) { var cookie = rwLock.UpgradeToWriterLock(Timeout.Infinite); try { var typeName = "DynamicClass" + (classCount + 1); #if ENABLE_LINQ_PARTIAL_TRUST new ReflectionPermission(PermissionState.Unrestricted).Assert(); #endif try { var tb = module.DefineType(typeName, TypeAttributes.Class | TypeAttributes.Public, typeof(DynamicClass)); var fields = GenerateProperties(tb, properties); GenerateEquals(tb, fields); GenerateGetHashCode(tb, fields); Type result = tb.CreateTypeInfo(); classCount++; return result; } finally { #if ENABLE_LINQ_PARTIAL_TRUST PermissionSet.RevertAssert(); #endif } } finally { rwLock.DowngradeFromWriterLock(ref cookie); } }
private Type CreateDynamicClass(Signature signature) { #if SILVERLIGHT _rwLock.UpgradeToWriterLock(Timeout.Infinite); #else _rwLock.EnterWriteLock(); #endif try { Type type; //do a final check to make sure the type hasn't been generated. if (_classes.TryGetValue(signature, out type)) { return(type); } string typeName = "DynamicClass" + (_classCount + 1); #if ENABLE_LINQ_PARTIAL_TRUST new ReflectionPermission(PermissionState.Unrestricted).Assert(); #endif try { TypeBuilder tb = this._module.DefineType( typeName, TypeAttributes.Class | TypeAttributes.Public, typeof(DynamicClass)); FieldInfo[] fields = GenerateProperties(tb, signature.properties); GenerateConstructor(tb, fields); GenerateEquals(tb, fields); GenerateGetHashCode(tb, fields); Type result = tb.CreateType(); _classCount++; _classes.Add(signature, result); return(result); } finally { #if ENABLE_LINQ_PARTIAL_TRUST PermissionSet.RevertAssert(); #endif } } finally { #if SILVERLIGHT _rwLock.DowngradeToReaderLock(); #else _rwLock.ExitWriteLock(); #endif } }
Type CreateAndCacheDynamicClass(Signature signature) { LockCookie cookie = rwLock.UpgradeToWriterLock(Timeout.Infinite); try { Type type; if (!classes.TryGetValue(signature, out type)) { type = CreateDynamicClass(signature.properties); classes.Add(signature, type); } return(type); } finally { rwLock.DowngradeFromWriterLock(ref cookie); } }