2012-04-23 19 views
6

Esta pregunta está relacionada con this one, pero no es un duplicado. Jb publicado allí que para añadir un atributo personalizado, el siguiente fragmento funcionaría:Cómo agrego un atributo personalizado sin un constructor predeterminado usando mono.cecil

ModuleDefinition module = ...; 
MethodDefinition targetMethod = ...; 
MethodReference attributeConstructor = module.Import(
    typeof(DebuggerHiddenAttribute).GetConstructor(Type.EmptyTypes)); 

targetMethod.CustomAttributes.Add(new CustomAttribute(attributeConstructor)); 
module.Write(...); 

me gustaría usar algo similar, pero para agregar un atributo personalizado cuyo constructor toma dos parámetros de cadena en su constructor (sólo), y me gustaría especificar valores para esos (obviamente). ¿Alguien puede ayudar?

Respuesta

12

En primer lugar hay que obtener una referencia a la versión correcta del constructor:

MethodReference attributeConstructor = module.Import(
    typeof(MyAttribute).GetConstructor(new [] { typeof(string), typeof(string) })); 

A continuación, puede rellenar los atributos personalizados con argumentos de cadena:

CustomAttribute attribute = new CustomAttribute(attributeConstructor); 
attribute.ConstructorArguments.Add(
     new CustomAttributeArgument(
      module.TypeSystem.String, "Foo")); 
attribute.ConstructorArguments.Add(
     new CustomAttributeArgument(
      module.TypeSystem.String, "Bar")); 
+0

rápida como siempre Jb - muchas gracias por la ayuda. Demasiado rápido para que acepte la respuesta, lo que haré en unos minutos ... –

+0

Google debe estar indexando SO en tiempo real: estoy usando una alerta de google simple en Mono.Cecil. –

+0

Guau - impresionante. –

2

Aquí le mostramos cómo configurar Named Parámetros de un atributo personalizado que omite por completo la configuración de un valor de atributo utilizando sus constructores. Como nota, no puede establecer CustomAttributeNamedArgument.Argument.Value o incluso CustomAttributeNamedArgument.Argument directamente ya que son de solo lectura.

El siguiente es equivalente a establecer - [XXX(SomeNamedProperty = {some value})]

var attribDefaultCtorRef = type.Module.Import(typeof(XXXAttribute).GetConstructor(Type.EmptyTypes)); 
    var attrib = new CustomAttribute(attribDefaultCtorRef); 
    var namedPropertyTypeRef = type.Module.Import(typeof(YYY)); 
    attrib.Properties.Add(new CustomAttributeNamedArgument("SomeNamedProperty", new CustomAttributeArgument(namedPropertyTypeRef, {some value}))); 
    method.CustomAttributes.Add(attrib); 
Cuestiones relacionadas