1

I'm pulling all of the advanced features together for this one, but haven't worked with generics or lambda expressions very much:

Here's example usage of the method I want to create:

MyClass mc = null;
int x = mc.TryGetOrDefault(z => z.This.That.TheOther); // z is a reference to mc
// the code has not failed at this point and the value of x is 0 (int's default)
// had mc and all of the properties expressed in the lambda expression been initialized
// x would be equal to mc.This.That.TheOther's value

Here's as far as I've gotten, but I'm not sure what to do with this expression object.

[enter image description here1

6
  • Yeah, turns out it was the firewall here blocking it... Doh... Commented Jul 19, 2011 at 20:23
  • mc is null - I am not sure what you try to achieve... what happens when you assign mc before using that expression ? Commented Jul 19, 2011 at 20:29
  • thats the point. if mc is null or any other exception gets thrown i get the default of TResult. Otherwise i get what I'm after. Commented Jul 19, 2011 at 20:30
  • Why are you using an expression tree in the first place, instead of just a delegate? It's still not really clear what the precedence is - do you want the lambda to be called at all if obj is non-null? Commented Jul 19, 2011 at 20:31
  • I think he wants to be able to pass in an expression that selects an object's properties (or property of property etc), and have it handle null values all along the way. Similar to the With extension method that @Jon's done (but i can't find). Commented Jul 19, 2011 at 20:33

3 Answers 3

1

Is this the sort of thing you're after?

public static TResult TryGetOrDefault<TSource, TResult>(this TSource obj, Func<TSource, TResult> expression)
{
    if (obj == null)
        return default(TResult);

    try
    {
        return expression(obj);
    }
    catch(NullReferenceException)
    {
        return default(TResult);
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

There's also some idea's here : stackoverflow.com/questions/4958133/…
0

What you are trying to do sounds like Maybe.

Project Description:

Maybe or IfNotNull using lambdas for deep expressions in C#

int? CityId= employee.Maybe(e=>e.Person.Address.City);

Update: There is more discussion about how best to accomplish this sort of thing at this question.

Comments

0

Here's what I was after:

    public static TResult TryGetOrDefault<TSource, TResult>(this TSource obj, Func<TSource, TResult> function, TResult defaultResult = default(TResult))
    {
        try
        {
            defaultResult = function(obj);
        }
        catch (NullReferenceException) { }
        return defaultResult;
    }

2 Comments

Please do not swallow exceptions!
I updated and I think that's better. I hear what you are saying and I will be careful when using this method.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.