2009-09-26 5 views
0

static class의 nattribute에 정규식을 추가하고 싶습니다.정적 정규 표현식 클래스를 사용하고 속성과 함께 사용할 수있는 방법이 있습니까?

[으로 RegularExpression (MyRegex.DecimalRegEx)] 클래스에서

가 :

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

내가 속성이 CONST 발을 필요로 알 - 이번 라운드 방법이 없다?

감사

데비

답변

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))] 
+0

감사합니다 - 당신이 시도해야? 그것은 컴파일되지 않습니다 - 속성을 제네릭 타입에 할당 할 수 없습니까? – Davy

+0

나는 그것을 컴파일하는데 피곤하지 않았다. (VS를 사용할 수 없었다) 이제는 고쳐졌다. 위의 버전이 지금 컴파일됩니다. –

+0

고마워요 shay -이 일찍 게시해야하지만 DataAnnotations도 함께 사용하려고 mTrying, 문자열을 기대하는이 istead 사용할 방법이 있습니까? - 아주 슬프다. – Davy

2

그것은 당신이 말한대로, 인수가 상수 값이어야합니다 속성 때문에 속성에 정규식의 인스턴스를 추가 할 수 없습니다. CLR/CLI의 제한 사항이므로이 제한을 해결할 방법이 없습니다.

여러분이 할 수있는 최선은 속성 생성자 내부의 Regex 's로 변환되는 문자열 값을 취하는 것입니다.

public class RegularExpressionAttribute : Attribute { 
    public readonly string StringValue; 
    public readonly Regex Regex; 
    public RegularExpressionAttribute(string str) { 
    StringValue = str; 
    Regex = new Regex(str); 
    } 
} 
관련 문제