¿Hay alguna manera de forzar al compilador a restringir el uso de un atributo personalizado para ser utilizado solo en tipos específicos de tipos int, short, string (todos los tipos primitivos)?
similar a AttributeUsageAttribute 's ValidOn- AttributeTargets enumeración.Permitir un atributo personalizado solo en el tipo específico
Respuesta
No, no puedes, básicamente. Puede limitarlo a struct
frente a class
frente a interface
, eso es todo. Además: no puede agregar atributos a tipos fuera de su código de todos modos (a excepción de a través de TypeDescriptor
, que no es lo mismo).
Puede escribir el código usted mismo para imponer el uso correcto de su clase de atributo, pero eso es todo lo que puede hacer.
nota al margen: un atributo no tiene acceso a su propio contexto, por lo que cualquier comprobación aquí tendría que estar en el código de reflexión que consulta el atributo –
Escribí una prueba unitaria (NUnit) una vez que usé Cecil para verificar mis usos de atributo "permisible". – Amy
Buenos tiempos ..... –
Puede ejecutar esta prueba de unidad para verificarlo.
En primer lugar, declarar la validación de atributos PropertyType:
[AttributeUsage(AttributeTargets.Class)]
// [JetBrains.Annotations.BaseTypeRequired(typeof(Attribute))] uncomment if you use JetBrains.Annotations
public class PropertyTypeAttribute : Attribute
{
public Type[] Types { get; private set; }
public PropertyTypeAttribute(params Type[] types)
{
Types = types;
}
}
Crear prueba de unidad:
[TestClass]
public class TestPropertyType
{
public static Type GetNullableUnderlying(Type nullableType)
{
return Nullable.GetUnderlyingType(nullableType) ?? nullableType;
}
[TestMethod]
public void Test_PropertyType()
{
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
var allPropertyInfos = allTypes.SelectMany(a => a.GetProperties()).ToArray();
foreach (var propertyInfo in allPropertyInfos)
{
var propertyType = GetNullableUnderlying(propertyInfo.PropertyType);
foreach (var attribute in propertyInfo.GetCustomAttributes(true))
{
var attributes = attribute.GetType().GetCustomAttributes(true).OfType<PropertyTypeAttribute>();
foreach (var propertyTypeAttr in attributes)
if (!propertyTypeAttr.Types.Contains(propertyType))
throw new Exception(string.Format(
"Property '{0}.{1}' has invalid type: '{2}'. Allowed types for attribute '{3}': {4}",
propertyInfo.DeclaringType,
propertyInfo.Name,
propertyInfo.PropertyType,
attribute.GetType(),
string.Join(",", propertyTypeAttr.Types.Select(x => "'" + x.ToString() + "'"))));
}
}
}
}
Su atributo, por ejemplo, permitir que los tipos de propiedad única decimales:
[AttributeUsage(AttributeTargets.Property)]
[PropertyType(typeof(decimal))]
public class PriceAttribute : Attribute
{
}
Ejemplo modelo:
public class TestModel
{
[Price]
public decimal Price1 { get; set; } // ok
[Price]
public double Price2 { get; set; } // error
}
- 1. restringir el tipo de propiedad de un atributo personalizado
- 2. Permitir cualquier propiedad/atributo en un servidor/usercontrol
- 3. Cambie el valor de un atributo específico
- 4. GSON - serializador personalizado en el caso específico
- 5. TinyMCE, permitir datos atributo
- 6. ¿El atributo de HTML personalizado requiere un ayudante personalizado?
- 7. Encontrar elemento específico basado en un atributo
- 8. DropDownListFor con un atributo personalizado con - en nombre de atributo?
- 9. css3 de atributo específico
- 10. Cómo crear un atributo personalizado en C#
- 11. cómo tener un atributo personalizado en ConfigurationElementCollection?
- 12. Permitir a los usuarios elegir un tema personalizado en Rails
- 13. atributo personalizado en el elemento HTML
- 14. ¿Cómo implementar el atributo Autorizar personalizado para el siguiente caso?
- 15. Unidad de Pruebas un atributo personalizado clase
- 16. Permitir solo caracteres alfanuméricos para un UITextField
- 17. Obtener un NSArray de un solo atributo de un NSArray
- 18. Regex permitir dígitos y un solo punto
- 19. ¿Habilitar el editor WYSIWYG para el atributo personalizado de Magento?
- 20. Atributo personalizado en UserControl (* .ascx)?
- 21. jquery: obtener el valor del atributo personalizado
- 22. HTMLPurifier: Cómo permitir un solo atributo sin redefinir toda la lista blanca
- 23. C# Regex para permitir solo el alfanumérico
- 24. XSD restricción única en atributo de elementos relacionados de un tipo específico
- 25. jQuery: Encuentre el elemento con un atributo personalizado particular
- 26. XPath: Seleccione el primer elemento con un atributo específico
- 27. ¿Cómo crear un atributo de validación personalizado?
- 28. java anotación personalizado: crea un atributo opcional
- 29. .htaccess Permitir todo desde el agente de usuario específico
- 30. ¿Permitir solo números en el cuadro de texto en GWT?
No, esto no es posible. Lo máximo que puede hacer es escribir una prueba unitaria que use la reflexión y valide su uso. Pero nada en el compilador hará esto. – Amy
también; no puede agregar atributos a clases fuera de su control * de todos modos * - por lo que no puede agregar atributos a 'int' o' string'. ¿Quiere decir "solo para propiedades que * son *' int' o 'cadena'"? si es así, la respuesta sigue siendo "no"; p –
@MarcGravell por supuesto, menciono int, propiedades de cadena y no cambio la clase int en sí misma, pero editaré. gracias por la respuesta. – gdoron