Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# attribute text from resource file?

I have an attribute and i want to load text to the attribute from a resource file.

[IntegerValidation(1, 70, ErrorMessage = Data.Messages.Speed)] private int i_Speed; 

But I keep getting "An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type"

It works perfectly if i add a string instead of Data.Messages.Text, like:

[IntegerValidation(1, 70, ErrorMessage = "Invalid max speed")] 

Any ideas?

like image 617
Patrick Avatar asked Jul 19 '09 20:07

Patrick


2 Answers

Here is my solution. I've added resourceName and resourceType properties to attribute, like microsoft has done in DataAnnotations.

public class CustomAttribute : Attribute {      public CustomAttribute(Type resourceType, string resourceName)     {             Message = ResourceHelper.GetResourceLookup(resourceType, resourceName);     }      public string Message { get; set; } }  public class ResourceHelper {     public static  string GetResourceLookup(Type resourceType, string resourceName)     {         if ((resourceType != null) && (resourceName != null))         {             PropertyInfo property = resourceType.GetProperty(resourceName, BindingFlags.Public | BindingFlags.Static);             if (property == null)             {                 throw new InvalidOperationException(string.Format("Resource Type Does Not Have Property"));             }             if (property.PropertyType != typeof(string))             {                 throw new InvalidOperationException(string.Format("Resource Property is Not String Type"));             }             return (string)property.GetValue(null, null);         }         return null;      } } 
like image 143
Peter Starbek Avatar answered Sep 20 '22 07:09

Peter Starbek


Attribute values are hard-coded into the assembly when you compile. If you want to do anything at execution time, you'll need to use a constant as the key, then put some code into the attribute class itself to load the resource.

like image 32
Jon Skeet Avatar answered Sep 18 '22 07:09

Jon Skeet