Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
            }
        }