Respuesta

0

Los atributos no pueden hacer esto

ver C# attribute text from resource file?

Resource.ResourceName sería una propiedad de cadena, atribuir parámetros sólo pueden ser constantes, enumeraciones, typeofs

7

Ahí está el DisplayAttribute que se ha añadido en .NET 4.0, que le permite especificar una cadena de recursos:

[Display(Name = "UsernameField")] 
string Username; 

Si no puede utilizar .NET 4.0 aún puede escribir su propio atributo:

public class DisplayAttribute : DisplayNameAttribute 
{ 
    public DisplayAttribute(Type resourceManagerProvider, string resourceKey) 
     : base(LookupResource(resourceManagerProvider, resourceKey)) 
    { 
    } 

    private static string LookupResource(Type resourceManagerProvider, string resourceKey) 
    { 
     var properties = resourceManagerProvider.GetProperties(
      BindingFlags.Static | BindingFlags.NonPublic); 

     foreach (var staticProperty in properties) 
     { 
      if (staticProperty.PropertyType == typeof(ResourceManager)) 
      { 
       var resourceManager = (ResourceManager)staticProperty 
        .GetValue(null, null); 
       return resourceManager.GetString(resourceKey); 
      } 
     } 
     return resourceKey; 
    } 
} 

que se podría utilizar como esto:

[Display(typeof(Resources.Resource), "UsernameField"), 
string Username { get; set; } 
+1

que no permite utilizar * * fuertemente ** recursos escritos. DisplayNameAttribute fue un mal ejemplo, ya que no permite el uso débilmente tipado :) Mi pregunta no es acerca de DisplayName que no permite el uso de los recursos, porque, como respondiste, esto se puede administrar fácilmente. Mi pregunta es acerca de su uso ** fuertemente tipado ** y no solo con este atributo, sino con cada atributo en DataAnnotations. – LukLed

+0

Esta debería ser la respuesta aceptada a la pregunta "¿Hay alguna otra solución?". La respuesta aceptada actual es simplemente "No, no puedes" –

0

esto ahora funciona como debería en MVC3, como se menciona en ScottGu's post, y le permitiría usar el atributo DisplayAttribute incorporado con un archivo de recursos localizado.

+0

:) Eso no es lo que necesito. Cuando escribí esta pregunta, no me di cuenta de que el atributo DisplayName no toma ningún recurso. Lo que realmente quiero usar es ** fuertemente ** ('ResourceClass.ResourceName') recursos escritos con todos los atributos. – LukLed

Cuestiones relacionadas