2010-01-15 9 views
0

옵션이 많아서 모든 다른 페이지/탭에 로컬 옵션이있을 수 있습니다. 어쩌면 10-15 페이지 탭을 열어 볼 수 있습니다. 전역 기본값을 표시하는 방법을 구현해야하며 모든 탭의 일관된 값을 유지해야합니다. WPF 앱의 model/viewmodel 부분을 작업하고 있습니다.매개 변수로 속성? C#

대략 20 번 이상 동일한 코드를 자르고 과거의 속성 이름을 변경해야하기 때문에보다 우아한 방법을 찾고 싶습니다. 어쩌면 이것은 다이나믹스가 해결하는 문제 일지 모르지만, 지금 당장은 이것이 잘못되고 고통 스러울 것입니다. 여기

내 현재 솔루션의 예입니다

public class Foo 
{ 
    private bool fooVar1; 
    private bool fooVar2; 
    //lots of these 
    private decimal fooVar23; 

    public Foo() 
    { 
    } 

    public bool FooVar1 
    { 
     get; 
     set; 
    } 

    //you get the picture... 
} 

public class FooMonitor 
{ 
    private Foo defaultFoo; 
    private List<Foo> allFoos; 

    public FooMonitor(Foo DefaultFoo) 
    { 
     defaultFoo = DefaultFoo; 
    } 

    public void AddFoo(Foo newFoo) 
    { 
     allFoos.Add(newFoo); 
    } 

    public void AddFoo(Foo oldFoo) 
    { 
     allFoos.Remove(oldFoo); 
    } 

    public bool IsFooVar1Consistent 
    { 
     get 
     { 
      Foo[] tempFoos = allFoos.ToArray(); 
      foreach (Foo tempFoo in tempFoos) 
      { 
       if (tempFoo.FooVar1 != defaultFoo.FooVar1) return false; 
      } 
      return true; 
     } 
    } 
} 

아니면 내가 완전히 잘못이 문제에 접근하고있다. 이 글을 쓰고 있는데 (2000 줄 정도의 코드를 작성한 후) WPF 자체가 Dictionary lookup을 구현하는 것을 읽었을 때, 부모에게 크롤링하여 속성이 존재하고 값이 무엇인지 알아 보는 방법을 생각하고 있습니다. .

답변

2

내가 잘라 과거 거의 같은 코드를 20 개 이상의 시간 을 그냥 속성 이름을 변경하지 못했습니다 더 우아한 방법을 찾고 싶어요.

코드 생성기가이 용도로만 제공됩니다. 하지만 그 길을 가고 싶지 않다면 코드를 다음과 같이 단축 할 수 있습니다 :

return allFoos.All(foo => foo.FooVar1 == defaultFoo.FooVar1); 
+0

다른 패턴에 대한 전체 코드를 다시 작성하는 것이 부족하다고 생각합니다. –

3

글쎄, 처음에는 결코 사용되지 않을 배킹 필드와 자동 속성을 정의하고 있습니다. 간단한 bool 속성이면 충분합니다.

public bool FooVar1 { get; set; } 

개인 필드가 필요 없습니다. 이것은 크게 예제의 줄 수를 줄입니다.

+0

+1 나를 가르치기 위해. –

2

나는 문제가 무엇인지 확실히 모르겠지만, 당신이 IsFoorVarXConsistent 코드를 통합 할 수있는 방법을 찾고 있다면, 당신이 반사를 사용하거나 표현식에 전달하여 할 수있는 :

public bool IsConsistent(Func<Foo, bool> property) 
{ 
    foreach (Foo tempFoo in allFoos) 
    { 
    if (property(tempFoo) != property(defaultFoo)) 
     return false; 
    } 
    return true; 
} 

다음과 같이 호출되었습니다.

bool is1Consistent = IsConsistent(f => f.FooVar1); 

위와 같이 부울 속성에서만 작동합니다. 다른 유형으로 확장하려면 속성 유형에서 일반화 할 수 있습니다. 그러나이 경우 모든 유형이! = 연산자를 정의하지는 않기 때문에! =을 사용하여 부등식을 테스트 할 수는 없습니다. 대신 .Equals 메소드와! 연산자

public bool IsConsistent<T>(Func<Foo, T> property) 
    where T : struct 
{ 
    foreach (Foo tempFoo in allFoos) 
    { 
    if (!property(tempFoo).Equals(property(defaultFoo))) 
     return false; 
    } 
    return true; 
} 

where T : struct 절 INT, BOOL 진수 같은 값 유형이 제한한다. 특히 문자열에서 작동하지 않습니다. where 제약 조건을 제거하면 문자열 및 기타 참조 유형에서 작동 할 수 있지만 property(tempFoo)이 null이 될 가능성이 있습니다.이 경우에 .Equals를 호출하면 NullReferenceException이 발생합니다. 따라서 값 유형 제약 조건을 제거하면이 시나리오에 대한 오류 처리를 추가해야합니다.

+0

이것은 작동 할 수 있습니다. 값 유형이 아닌 모든 객체에 ==를 정의했습니다. –

관련 문제