有没有办法让静态正则表达式类和属性一起使用?

时间:2009-09-26 15:56:00

标签: regex attributes

我想从静态类中为自然属性添加正则表达式。

[正则表达式(MyRegex.DecimalRegEx)]

来自一个班级:

 public static class MyRegex
    {        
        public static string Decimal_Between_1_And_100
        {
            get
            {
                return (@"^\s*\d+(\.\d{1,2})?\s*$");           
            }
        }        
    }

我知道该属性需要一个常量 - 这是不可能的?

感谢

戴维

2 个答案:

答案 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))]