मैं गहरी लम्दा अभिव्यक्ति में नल की जांच कैसे कर सकता हूं?गहरी लैम्ब्डा अभिव्यक्ति में नल के लिए कैसे जांचें?
कहते हैं, उदाहरण के लिए मैं एक वर्ग संरचना है कि नेस्ट किया गया था कई परतों गहरी है, और मुझे निम्नलिखित लैम्ब्डा निष्पादित करने के लिए चाहता था:
x => x.Two.Three.Four.Foo
मैं यह शून्य वापस जाने के लिए अगर दो, तीन, या चार अशक्त थे चाहते हैं , System.ullReferenceException फेंकने के बजाए।
public class Tests
{
// This test will succeed
[Fact]
public void ReturnsValueWhenClass2NotNull()
{
var one = new One();
one.Two = new Two();
one.Two.Three = new Three();
one.Two.Three.Four = new Four();
one.Two.Three.Four.Foo = "blah";
var result = GetValue(one, x => x.Two.Three.Four.Foo);
Assert.Equal("blah", result);
}
// This test will fail
[Fact]
public void ReturnsNullWhenClass2IsNull()
{
var one = new One();
var result = GetValue(one, x => x.Two.Three.Four.Foo);
Assert.Equal(null, result);
}
private TResult GetValue<TModel, TResult>(TModel model, Expression<Func<TModel, TResult>> expression)
{
var func = expression.Compile();
var value = func(model);
return value;
}
public class One
{
public Two Two { get; set; }
}
public class Two
{
public Three Three { get; set; }
}
public class Three
{
public Four Four { get; set; }
}
public class Four
{
public string Foo { get; set; }
public string Bar { get; set; }
}
}
अद्यतन:
एक समाधान इस तरह NullReferenceException को पकड़ने के लिए होगा:
private TResult GetValue<TModel, TResult>(TModel model, Expression<Func<TModel, TResult>> expression)
{
TResult value;
try
{
var func = expression.Compile();
value = func(model);
}
catch (NullReferenceException)
{
value = default(TResult);
}
return value;
}
लेकिन मैं एक अपवाद है कि नहीं है, मेरे मन में पकड़ने की कीमत उठाना नफरत है, असाधारण। मुझे उम्मीद है कि यह मेरे डोमेन में अक्सर मामला होगा।
अद्यतन 2:
एक अन्य समाधान इस तरह संपत्ति ही टिककर खेल को संशोधित होगा:
public class One
{
private Two two;
public Two Two
{
get
{
return two ?? new Two();
}
set
{
two = value;
}
}
}
जो ज्यादातर अपने डोमेन के लिए ठीक है, लेकिन कई बार जब मैं वास्तव में एक संपत्ति वापस करने के लिए उम्मीद कर रहे हैं शून्य। मैंने जोश ई से उत्तर की मदद की क्योंकि यह कुछ मामलों में मुझे जो चाहिए वह बहुत करीब आता है।
public static class Get {
public static T IfNotNull<T, U>(this U item, Func<U, T> lambda) where U: class {
if (item == null) {
return default(T);
}
return lambda(item);
}
}
var one = new One();
string fooIfNotNull = one.IfNotNull(x => x.Two).IfNotNull(x => x.Three).IfNotNull(x => x.Four).IfNotNull(x => x.Foo);
यह बहुत अधिक संक्षिप्त है। Maybe (x => x.Two.Three.Four.Foo); http://maybe.codeplex.com/ – Maslow