2008-09-26 14 views
6

Sé que es posible, y he visto ejemplos simples en la documentación, ¿pero están siendo utilizados en la naturaleza?¿Hay algún ejemplo práctico de cómo han utilizado los atributos en los parámetros del método en .NET?

Uso los atributos en el nivel de clase y método todo el tiempo, pero nunca los he usado en los parámetros del método. ¿Cuáles son algunos ejemplos del mundo real y las razones del uso?

No estoy interesado en ver un ejemplo de libro de texto, claro. Hay muchos de esos por ahí. Quiero ver una razón real por la cual resolvió un problema particular para ti.

EDITAR: Dejemos a un lado la discusión sobre si se deben usar o no los atributos en primer lugar. Entiendo que a algunas personas no les gustan porque "ensucian" su código. ¡Eso es para una discusión diferente!

+0

No importa. Mi ejemplo es una mierda Pero WCF hace esto. Lo he visto, simplemente no puedo encontrar un ejemplo en este momento. – Will

Respuesta

9

Puede, por ejemplo, crear un ValidatorAttribute para cada parámetro, luego, antes de llamar al método, puede reflejar los atributos del parámetro y realizar la validación del parámetro. Luego llama al método si todo está bien.

+0

muy interesante, nunca pensé usar de esa manera. bueno, nunca pensé en usarlos en absoluto, pero independientemente. te hace pensar. – mattlant

+0

Muy interesante. Me gusta eso. – Kilhoffer

+0

es muy interesante y hace que las cosas sean robustas, ¿pero esto no agrega demasiados gastos generales? –

3

(He dejado esta respuesta aquí en caso de que a otros les resulte una introducción útil a PostSharp, ¡pero en realidad no responde correctamente la pregunta! Leí mal la pregunta al preguntar sobre atributos de método en lugar de atributos de clase. Por lo que recuerdo, las clases SOAP generadas usan atributos de parámetros. LINQ to SQL usa atributos de retorno y puede usar atributos de parámetros también, cuando se trata de procesos almacenados)

Los utilizo con PostSharp, aunque solo admitido una demostración rápida hasta el momento (no he usado PostSharp en producción).

Ver my blog post para más detalles.

pruebas Ah, y por supuesto NUnit especifican [Test] por todo el lugar :)

Jon

+0

Al contestar esta pregunta, me presentó a PostSharp. Biblioteca muy interesante, de hecho. ¡Gracias! – Kilhoffer

+0

Vergüenza Aunque respondí la pregunta tan mal, ¡no la había leído correctamente! Ahora editaré ... –

+0

En realidad, no creo que Kilhoffer estuviera hablando de los atributos del método. Él está hablando de los atributos de los parámetros. – user9991

1

Dependency Injection es un muy buen escenario de ejemplo.

ObjectBuilder (un contenedor de inyección de dependencias, parte de P Enterprise Libary, que pronto será reemplazado por Unity), los utiliza en todas partes para atribuir lo que el contenedor debe inyectar en tiempo de ejecución. Aquí está un ejemplo rápido del constructor para una clase de controlador que tiene un valor de estado (inyectado de cualquier proveedor de estado está activo, por lo general HttpSession), así como dos dependencias de servicio (un localizador y un servicio de autorización):

public class ShellController : ControllerBase, IShellController 
    { 
     public ShellController([StateDependency("State")] StateValue<ShuttleState> state, 
           [ServiceDependency] IHttpContextLocatorService contextLocator, 
           [ServiceDependency] IAuthorizationService authService) 
      : base(state, contextLocator, authService) 
     { 
      // code goes here 
     } 
} 
0

Los marcos de prueba unitaria los usan ampliamente:

Para hacer cualquier cosa en nUnit o MSTest, debe decorar los métodos con un atributo [TestFixture] o [TestClass].

Mi favorito? Atributo [DataFixture] de MbUnit: permite sembrar casos de prueba con datos de prueba específicos directamente dentro del atributo o un recurso externo.

+0

Esos son atributos de clase o método, no atributos de parámetro de método como él preguntó. Un ejemplo de prueba de unidad sería el atributo Columna de MbUnit (http://code.google.com/p/mb-unit/source/browse/trunk/v3/src/MbUnit/MbUnit/Framework/ColumnAttribute.cs) –

Cuestiones relacionadas