我想从静态类中为自然属性添加正则表达式。
[正则表达式(MyRegex.DecimalRegEx)]
来自一个班级:
public static class MyRegex
{
public static string Decimal_Between_1_And_100
{
get
{
return (@"^\s*\d+(\.\d{1,2})?\s*$");
}
}
}
我知道该属性需要一个常量 - 这是不可能的?
感谢
戴维
答案 0 :(得分:2)
无法向属性添加Regex实例,因为正如您所说,属性参数必须是常量值。由于这是CLR / CLI的限制,因此无法解决此限制。
你能做的最好的事情就是把字符串值转换为属性构造函数内的Regex。
public class RegularExpressionAttribute : Attribute {
public readonly string StringValue;
public readonly Regex Regex;
public RegularExpressionAttribute(string str) {
StringValue = str;
Regex = new Regex(str);
}
}
答案 1 :(得分:0)
您可以指定MyRegEx类类型而不是正则表达式的实例,以下是这个想法。
public interface IRegexProvider
{
Regex Regex { get; }
}
public class RegularExpressionAttribute : Attribute
{
public readonly Type _factory;
public RegularExpressionAttribute(Type regexFactory)
{
_factory = regexFactory;
}
public Regex Regex
{
get
{
// you can cache this
var factory = (IRegexProvider)Activator.CreateInstance(_factory);
return factory.Regex;
}
}
}
// using
public class MyRegex : IRegexProvider
{
public Regex Regex
{
get
{
return new Regex(@"^\s*\d+(\.\d{1,2})?\s*$");
}
}
}
[RegularExpression(typeof(MyRegex))]