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?
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; } }
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With