Exemplo n.º 1
0
        public static void ProcessWeavableProperties(ILogger log, IEnumerable <PropertyWeaverSet> properties)
        {
            foreach (var propertyInfo in properties)
            {
                var property = propertyInfo.Property;

                if (property.SetMethod == null)
                {
                    log.Error($"The property `{property.Name}` on type `{property.DeclaringType.FullName}` cannot be rewritten to include validation because it does not have a setter.");
                    continue;
                }

                var appender = new IlProcessorAppender(property.SetMethod, null);

                foreach (var weaver in propertyInfo.Weavers)
                {
                    if (!weaver.Weaver.IsValidOn(property.PropertyType))
                    {
                        log.Error($"The attribute `{weaver.Weaver.AttributeTypeName}` cannot be applied to a property of type `{property.PropertyType.Name}`");
                    }
                    else
                    {
                        weaver.Weaver.Execute(weaver.GetInstantiatedAttribute(), property, appender);
                        property.CustomAttributes.Remove(weaver.CustomAttribute);
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static void ProcessWeavableParameters(ILogger log, IEnumerable <ParameterWeaverSet> parameters)
        {
            foreach (var parameterInfo in parameters)
            {
                var parameter = parameterInfo.Parameter;
                var method    = parameterInfo.Method;

                Instruction firstInstruction;

                if (parameterInfo.Method.IsConstructor)
                {
                    // We make sure the validation occurs after the this/base call
                    // in order to preserve the behaviour that the C# compiler would
                    // have generated had the checks been written by hand
                    firstInstruction = parameterInfo.Method.FindChainedCall();
                }
                else
                {
                    firstInstruction = null;
                }

                var appender = new IlProcessorAppender(method, firstInstruction);

                foreach (var weaver in parameterInfo.Weavers)
                {
                    if (!weaver.Weaver.IsValidOn(parameter.ParameterType))
                    {
                        log.Error($"The attribute `{weaver.Weaver.AttributeTypeName}` cannot be applied to a method parameter of type `{parameter.ParameterType.Name}`");
                    }
                    else
                    {
                        weaver.Weaver.Execute(weaver.GetInstantiatedAttribute(), parameter, appender);
                        parameter.CustomAttributes.Remove(weaver.CustomAttribute);
                    }
                }
            }
        }
Exemplo n.º 3
0
 public void Execute(Attribute attribute, PropertyDefinition property, IlProcessorAppender ilProcessor)
 => ExecuteProperty(attribute, property, ilProcessor);
Exemplo n.º 4
0
 public void Execute(Attribute attribute, ParameterDefinition parameter, IlProcessorAppender ilProcessor)
 => ExecuteParameter(attribute, parameter, ilProcessor);