public static SecurityDeclaration ToSecurityDeclaration(this PermissionSet self, SecurityAction action, ModuleDefinition module)
        {
            if (self == null)
            {
                throw new ArgumentNullException("self");
            }
            if (module == null)
            {
                throw new ArgumentNullException("module");
            }

            var declaration = new SecurityDeclaration(action);

            var attribute = new SecurityAttribute(
                module.TypeSystem.LookupType("System.Security.Permissions", "PermissionSetAttribute"));

            attribute.Properties.Add(
                new CustomAttributeNamedArgument(
                    "XML",
                    new CustomAttributeArgument(
                        module.TypeSystem.String, self.ToXml().ToString())));

            declaration.SecurityAttributes.Add(attribute);

            return(declaration);
        }
        static IPermission CreatePermission(SecurityDeclaration declaration, SecurityAttribute attribute)
        {
            var attribute_type = Type.GetType(attribute.AttributeType.FullName);

            if (attribute_type == null)
            {
                throw new ArgumentException("attribute");
            }

            var security_attribute = CreateSecurityAttribute(attribute_type, declaration);

            if (security_attribute == null)
            {
                throw new InvalidOperationException();
            }

            CompleteSecurityAttribute(security_attribute, attribute);

            return(security_attribute.CreatePermission());
        }
        static void CompleteSecurityAttributeFields(SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
        {
            var type = security_attribute.GetType();

            foreach (var named_argument in attribute.Fields)
            {
                type.GetField(named_argument.Name).SetValue(security_attribute, named_argument.Argument.Value);
            }
        }
        static void CompleteSecurityAttributeProperties(SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
        {
            var type = security_attribute.GetType();

            foreach (var named_argument in attribute.Properties)
            {
                type.GetProperty(named_argument.Name).SetValue(security_attribute, named_argument.Argument.Value, null);
            }
        }
        static void CompleteSecurityAttribute(SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
        {
            if (attribute.HasFields)
            {
                CompleteSecurityAttributeFields(security_attribute, attribute);
            }

            if (attribute.HasProperties)
            {
                CompleteSecurityAttributeProperties(security_attribute, attribute);
            }
        }