2013-08-13 5 views
1

나는 약 40 개의 속성을 가진 클래스가있다. (나는 이것에 대해 말하지 않는다. 스펙대로이다.) 모든 속성에는 사용자 지정 "set"메서드가 있습니다.이 코드 블록을 다시 쓰는 방법은 무엇입니까?

모든 "설정"방법에 대해 약간의 복잡한 검증이 필요합니다. 이미 유효성 검사를 별도의 방법으로 분리했습니다.

CommonValidate(string PropertyName, string PropertyValue)으로 전화를 걸 수 있습니다.

public string Property1 
    { 
     set 
     { 
      this.field1 = value; 
      CommonValidate(Property1, this.field1); 
     } 
    } 

    public DateTime Property2 
    { 
     set 
     { 
      this.field2 = value.ToString("ddMMyy");; 
      CommonValidate(Property2, this.field2); 
     } 
    } 

    public string Property3 
    { 
     set 
     { 
      this.field3 = value; 
      CommonValidate(Property3, this.field3); 
     } 
    } 

난 그냥 모든 (40)이 방법을 "설정"에서 호출 CommonValidate 방법을 붙여 넣은이 방법을 : 나는 각에서이 검증 메소드를 호출하고 지금부터 당신이 아래에 볼 수

는 방법을 "설정" . 이 방법은 매우 효과적이지 않습니다. CommonValidate 메소드의 인수 개수에 대한 변경 요청이 있는지 상상해보십시오.

더 나은 모드로 변경할 수있는 다른 방법이 있습니까?

+3

http://codereview.stackexchange.com/ – wudzik

+3

이것은 codereview 질문이 아닙니다. –

+0

CommonValidate에 "this"만 전달합니까? –

답변

1

리플렉션을 사용하면 속성의 이름과 새 값에 전달하는 함수를 사용할 수 있습니다. 유효성 검사를 수행 한 다음 값으로 일반 세트를 수행합니다. 반사는 속도면에서는 효율적이지 않지만 코드를 재사용 할 때 유용합니다. 시간 상실을 확인하기 위해 진단을 수행하십시오.

propsClass는 속성이있는 클래스 개체입니다. 클래스 내에서이를 수행하거나 함수에서 다른 매개 변수로 전달할 수 있습니다.

0

누군가 이미 동적 클래스에 대해 언급했지만, 익숙하지 않습니다. 그러나 잠깐 읽고 있으면 문제에 대해 다소 매력적입니다.

그러나 경로를 지정하지 않으면 변경해야 할 것은 CommonValidate에 문자열을 사용하고 대신 System.Linq.Expression을 사용하는 것입니다.

나는 같은 것을보고 그것을 다시 것 : 세터 다음

public string Property1 
{ 
    set 
    { 
     this.field1 = value; 
     CommonValidate(c => c.Property1, value); 
    } 
} 

이것의 장점은 같을 것이다 그런

static void CommonValidate<T>(Expression<Func<MyClass, T>> propertySelector, T newValue) //replace MyClass with name of current class 
{ 
    MemberExpression memberExpression = propertySelector.Body as MemberExpression; 
    if (memberExpression == null) 
     throw new ArgumentException("propertySelector") 

    string propertyName = MemberExpression.Member.Name; 

    //validation code, e.g. 

    CommonValidate(propertyName, newValue.ToString()) 
} 

을 당신은 속성의 이름을 변경하는 경우 귀하의 클래스, 컴파일 시간 오류 CommonValidate 호출을 변경되지 않습니다. 이 길을 가려면 유효성 검사를 설정하는 것과 비슷한 방법을 사용해야합니다. Dictionary<string, Func<string, bool>을 생성하는 생성자가 있다고 가정합니다. 위의 새 CommonValidate 코드와 비슷한 코드를 사용하여 대신 속성 이름 키를 가져옵니다. .

관련 문제