2011-08-11 4 views
3

보기에 레이블을 표시할지 여부를 지정하는 큰 핸들러 메서드를 정리하려고합니다. 나는 모든 지루한 작업을 수행하는 방법에 관련된 모든 구성 요소를 보내 같은 뭔가 생각하고 있어요C# 가능성을 사용하여 null 참조 피하기

if (Moo.Foo != null) { 
    Show(TrType, LabelType, Moo.Foo.DangerousNullRef + " - " + Moo.Foo.AnotherPossibleNullRef); 
} 
else { 
    DontShowField(TrType); 
} 

있지만 : 뭔가처럼

실제 구조는

ShowHandlingNull(Moo.Foo != null, TrType, LabelType, Moo.Foo.DangerousNullRef + " - " + Moo.Foo.AnotherPossibleNullRef); 

은 널 (null)을 일으킬 것인가 Moo.Foo가 null의 경우는 참조 행동을 위임하거나 일부 행동을 취하고 큰 방법으로 한 줄만 쓸 수 있습니까?

+0

'Moo.Foo'가 실제로 null이면 원하는 동작은 무엇입니까? – vcsjones

+0

@vcsjones 동작은 else 문을 호출합니다 :'DontShowField (TrType) ' – Custodio

답변

1

, 나는 당신의 의도에 몇 가지 가정을 만들어 당신을 가정 그 레이블 텍스트를 얻으려고해서 그걸 그렇게 썼습니다.

enum LabelTypeEnum 
    { 
     something 
    } 

    class MooClass 
    { 
     public FooClass Foo { get; set; } 
    } 

    class FooClass 
    { 
     public object DangerousNullRef { get; set; } 
     public object AnotherPossibleNullRef { get; set; } 
    } 

    private void Show(Type TrType, LabelTypeEnum LabelType, string p) { } 

    private void DontShowField(Type TrType) { } 

그런 다음 안전하게 속성에 액세스 액션을 사용할 수

private void YourFunction 
    { 
     Type TrType = this.GetType(); 
     MooClass Moo = new MooClass(); 
     LabelTypeEnum LabelType = LabelTypeEnum.something; 
     ShowIf(Moo, TrType, LabelType, new Object[] { Moo.Foo, Moo.Foo2, Moo.Foo3 }, a => a.Foo.DangerousNullRef + " - " + a.Foo.AnotherPossibleNullRef); 

    } 


    void ShowIf(MooClass Moo, Type t, LabelTypeEnum LabelType, IEnumerable<object> PreCheckNullsValues, Func<MooClass, string> mc) 
    { 
     if (PreCheckNullsValues.Any(a => a == null)) 
      Show(t, LabelType, mc(Moo)); 
     else 
      DontShowField(t); 
    } 

는 여기에 귀하의 지원 코드에 가정 골격입니다.

+0

이것은 좋은 해결책입니다! 하지만 Foo2, Foo3 ... Foo15 속성이 있습니다. 어떻게 동적으로 if 절을 할 수 있을까요? if (Moo. FooN "! = null)" – Custodio

+0

@ Custódio 클래스의 ANY가 null이거나 속성의 임의의 부분 집합이 null인지 확인하려고합니까? – deepee1

+0

deepee1 더 좋은 대답은 임의입니다. 나는 큰 Moo 클래스를 가지고 있고, 나는 그를 리팩토링하고있다. 그러나 이제 null인지를 검증 할 많은 프로퍼티를 가지고있다. – Custodio

1

이 점을 개선하지는 않겠지 만 람다를 통한 지연 실행을 사용하여 수행 할 수 있습니다.

ShowHandlingNull(Moo.Foo, TrType, LabelType, f => f.DangerousNullRef, f => f.AnotherPossibleNullRef); 

void ShowHandlingNull(Foo foo, object trType, objectLablelType, Func<Foo, object> dangerousNullRefGetter, Funct<Foo, object> anotherDangerousGetter) 
{ 
    if (foo == null) { 
     DontShowField(trType); 
     return; 
    } 
    Show(TrType, LabelType, dangerousNullRefGetter(foo) + " - " + anotherDangerousGetter(foo)); 
} 

원래는 if null 체크가 더 쉽게 이해하고 유지할 수 있다고 생각합니다.

+0

Moo가 null 인 경우 깨집니다. – sternr

+1

@sternr 그래서 현재 그가 어떻게하고 있는지에 대한 op의 게시물 – Manatherin

+0

죄송합니다. .. – sternr

0

당신은 문자열 "+"처럼 동작하고 null-References를 확인하고 문자열에 확장 메서드로 추가하는 몇 가지 메서드를 직접 작성할 수 있지만 이것이 과잉이라고 생각합니다. "Moo"(유형에 관계없이) 매개 변수를 사용하여 show-method를 변경/오버로드하고 거기에 체크인하십시오.

0

왜 안 시도하고 널 (null)

public static string ShowHandlingNull(this Foo foo, TrType trType, LabelType labelType) 
{ 
    if (foo == null) 
    { 
     return string.Empty; 
    } 
    return ...... 
} 

var result = Moo.Foo.ShowHandlingNull(trType, labelType); 
+0

이것은 해결책이지만 Moo는 많은 Foo 속성을 포함하고 있습니다. 따라서 n * 속성 확장을 만들어야합니다. :/ 나는 여기서 빠르게 계산했다. n은 약 15이다. – Custodio

0

사용에게 작은 확장 메서드 받아들이는 확장 메서드를 사용

public static class OrEmpty<T>(this T instance) where T : class, new() 
{ 
    return instance ?? new T(); 
} 

예 :

Show(TrType, LabelType, Moo.Foo.OrEmpty().DangerousNullRef + " - " + Moo.Foo.OrEmpty().AnotherPossibleNullRef); 

참고 그것은을 만들 것을 호출 당 새로운 객체. 개체를 많이 만들지 않도록 약간 더 고급화 할 수 있습니다.

1

Null Object pattern 지침을 따를 수 있습니다.

예를 들어, Moo.Foo가 인터페이스가 될 수 있으며 실제 클래스는 상기 인터페이스의 구현이되어야합니다. Foo가 null 인 경우, 즉 DontShowField 메서드를 처리하는 MooFooNull 클래스를 만듭니다.

는 는
// On Moo.Foo initialization, if the condition for creating of RealMooFoo are not met. 
Moo.Foo = new MooFooNull(this); 

// later on ... 
Moo.Foo.Show(TrType, LabelType, Moo.Foo.DangerousNullRef + " - " + Moo.Foo.AnotherPossibleNullRef); 
는 는 는 MooFooNull의 표시 방법은

:

이미 Func을가 최선의 해결책처럼 나에게 보이는이 문제를 처리하기 위해 사용하는 아이디어있다
void Show(TheClass theClass, object trType, ...) { 
    theClass.DontShowField(trType); 
} 
+0

이것은 해결책이지만, 나의 방법 Moo에는 많은 Foo 속성이 포함되어있다. 따라서 n * 속성 확장을 만들어야합니다. :/여기에서 빨리 계산됩니다. n은 약 15입니다. – Custodio

+0

필요한 데이터가있는 DTO를 만들 수 있습니다. 그래, 계속하십시오 .-) – Simone