문제

썼는 간단하 SessionItem 관리 등을 처리하는 모든 그 성가신 null 검사 및 삽입하는 기본값이 없는 경우가 존재합니다.여기에 내 GetItem 방법:

public static T GetItem<T>(string key, Func<T> defaultValue)
{
    if (HttpContext.Current.Session[key] == null)
    {
        HttpContext.Current.Session[key] = defaultValue.Invoke();
    }
    return (T)HttpContext.Current.Session[key];
}

지금,나는 어떻게 실제적으로 사용이 전달하면서 Func<T> 으로 인라인 방법을 매개 변수는?

도움이 되었습니까?

해결책

이후 func,람다는 것이 가장 간단한 방법:

Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));

는[신 Foo("ㅋ")]는 func 호출되는 기본값으로.

당신은 또한 단순화:

return ((T)HttpContext.Current.Session[key]) ?? defaultValue();

Where??은 null 통합 운영자는 경우 첫 번째 arg is non-null 이 반환됩니다;그렇지 않으면 오른쪽 손가(그래서 기본값()호출되지 않으면 않는 항목이 null).

마지막으로,당신은 단지 사용하려면 기본 생성자를,다음을 추가할 수 있습니다"새로운()"제약:

public static T GetItem<T>(string key)
    where T : new()
{
    return ((T)HttpContext.Current.Session[key]) ?? new T();
}

이것은 여전히 게-새로운()경우에만 사용됩 항목이 null 입니다.

다른 팁

기본값을 직접 전달하지 않는 이유는 무엇입니까? Functor는 어떤 용도로 사용됩니까?

그런데, defaultValue.Invoke() 상당히 장점입니다. 글을 쓰는 것도 가능합니다 defaultValue().

var log = SessionItem.GetItem("logger", () => NullLog.Instance)

메모, 일반적으로 getitem {t} 호출에서 {t} 사양을 건너 뛸 수 있습니다 (func {t} 동일한 유형의 개체를 반환합니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top