2011-01-31 23 views
15

es válido (es decir, se compila y se ejecuta.) Para poner un atributo en el parámetro genérico para una clase o un método:¿Qué uso tienen los atributos en los parámetros genéricos?

public class MyClass<[My] T> 
{ 
    private void MyMethod<[My] T>() 
    {} 
} 

public class MyAttribute : Attribute 
{} 

nunca he visto este utiliza, y estoy luchando para llegar a una razón de por qué querrías.

¿Es solo una peculiaridad/efecto secundario de la especificación del lenguaje, o hay una razón válida/útil para poner un atributo en esta posición?

+6

Esos son _parámetros_ genéricos, no restricciones. – SLaks

+4

No sabía que era posible aplicar atributos a parámetros genéricos. Genial :) –

+0

Nunca he visto esto, ¡es muy interesante gracias! Ahora si puedo encontrar un uso ... EDITAR: Puede usar atributos en parámetros para cualquier tipo de método, no solo genérico. Esto me está volviendo loco. – RichK

Respuesta

13

Por la misma razón, los atributos son útiles en cualquier construcción; proporcionan metadatos que pueden ser utilizados por Reflection u otros postprocesadores para hacer varias cosas. Por ejemplo, puede tener un sistema AOP que use un atributo en un argumento de tipo para aplicar ciertas restricciones de tiempo de ejecución que de otro modo no se podrían expresar. No estoy seguro de si hay algún sistema que realmente use estos atributos para hacer algo, pero no hay ninguna razón para rechazarlos como metadatos.

+0

He pensado en el caso de reflexión ya que utilizo el mismo enfoque para marcar clases en una aplicación, pero todavía me costaba pensar en un escenario para esta característica en particular. – adrianbanks

+3

adrianbanks: la respuesta de Dan es precisa. Por ejemplo, una vez escribí una herramienta que procesaba un parámetro genérico con [DelegateConstraint] o con [EnumConstraint] para cambiar su restricción a Delegate o Enum, para superar la limitación de C#. –

+0

@Jb Evain: ¡Hice lo mismo antes! LOL. –

1

Estoy seguro de que algunas tuercas AOP encontrarán una razón válida para decorar parámetros genéricos con atributos. Ciertamente no puedo pensar en ninguno. Prueba esto:

typeof(MyClass<>).GetGenericArguments().GetCustomAttributes().OfType<MyAttribute>(); 

Si esto Enumerable tiene ningún elemento, entonces es posible tener acceso al atributo que colocó en parámetro genérico de la clase. Si no es así, entonces no puede y, por lo tanto, tener datos a los que esperaría acceder desde cualquier otra clase en su base de código no tiene sentido. SIN EMBARGO, aún pueden tener código que se ejecuta cuando se crean instancias, y son instanciados por el tiempo de ejecución cuando la clase genérica entra en el alcance, lo que le permite realizar una lógica orientada a aspectos en el atributo en sí. Exactamente lo que sería, y cómo sería diferente a la decoración de la clase o método genérico directamente, se deja como un ejercicio para las personas que adoran AOP mucho más que yo.

Cuestiones relacionadas