이의 내가이 더미 클래스가 정의되어 있다고 가정하자멤버 액세스의 여러 수준 떨어져 휴식하는 방법
string info = null;
if (obj != null
&& obj.InterestingFact != null
&& obj.InterestingFact.Detail != null)
{
info = obj.InterestingFact.Detail.Information;
}
Ignor 다음 Information
속성에 액세스,이 같은 뭔가를 할 수 이 토론을 위해서 데메테르의 법칙 (Law of Demeter)을 위해서 내가 가지고있는 물건 속의 깊숙한 곳에 접근하기를 원할 때마다 이것은 아주 재미 있지 않습니다.
public static U NullOr<T, U>(this T target, Func<T, U> selector)
{
if (EqualityComparer<T>.Default.Equals(target, default(T)))
{
return default(U);
}
return selector(target);
}
이 좀 더 쉽게 데이터를 선택합니다 :
// Here I have a null of type string.
var info = obj.NullOr(o => o.InterestingFact).NullOr(f => f.Detail).NullOr(d => d.Information);
그러나이 긴 호흡이 조금 여전히 나는 물론, 확장 메서드를 만들 수 있습니다. 이상적으로, 나는이 같은 더 많은 일을하고 싶습니다 : 나는 Expression
의 일한 적이
// Here I should still have a null of type string.
var info = obj.NullOr(o => o.InterestingFact.Detail.Information);
을; 내가 을 NullOr
에 Func<T, U>
대신에 넣는다면 그것은 3 인이 아니라 1 인의 멤버 액세스 인 것 같습니다. 위의 방법에 접근 할 수 있습니까, 아니면이 배합이 도달 범위를 벗어 났습니까?
간단한 방법에 대해
이것은'? '를 사용하여 C#에 추가 된 것으로 [제안] (https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c)입니다. 연산자를 사용하지만 아직 언어로 변환하지 않았습니다. Mads는 그들이 진지하게 고려하고 있다고 말합니다. 언젠가는 당신이'obj? 흥미로운 사실? 자세히 "라는 정보를 쓸 수있을 것이라고합니다. 그때까지, 당신이하는 방식이 내가 아는 유일한 방법입니다. –
@MosheKatz : 저는 그것을 보았습니다. 그리고 소년은 제가 연산자 오버로딩으로 그것을 만들 수 있기를 바랬습니다. – zimdanen
가능한 [구성원 액세스 식 체인을 어떻게 세분합니까?] (http://stackoverflow.com/questions/11108254/how-do-i-break-down-a-chain-of-member-access) -Expressions) –