我正在为这一个提取所有高级功能,但是没有使用泛型或lambda表达式:
以下是我想要创建的方法的示例用法:
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
据我所知,但我不知道如何处理这个表达式对象。
[ 1
答案 0 :(得分:1)
这是你想要的事吗?
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);
}
}
答案 1 :(得分:0)
您尝试做的事情听起来像Maybe。
项目说明:
可能或者IfNotNull在C#中使用lambdas作为深层表达式
int? CityId= employee.Maybe(e=>e.Person.Address.City);
更新:有关如何最好地在this question完成此类事情的讨论。
答案 2 :(得分:0)
这就是我追求的目标:
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;
}