gpt4 book ai didi

c# - 使用 Expression 调用属性和对象并判断对象是否为 null

转载 作者:行者123 更新时间:2023-11-30 14:36:49 28 4
gpt4 key购买 nike

我希望能够调用可能为 null 的对象的属性,但调用时不必明确检查它们是否为 null。

像这样:

var something = someObjectThatMightBeNull.Property;

我的想法是创建一个接受表达式的方法,如下所示:

var something = GetValueSafe(() => someObjectThatMightBeNull.Property);

TResult? GetValueSafe<TResult>(Expression<Func<TResult>> expression)
where TResult : struct
{
// what must I do?
}

我需要做的是检查表达式并确定 someObjectThatMightBeNull 是否为空。我该怎么做?

如果有任何更聪明的懒惰方式,我也会很感激。

谢谢!

最佳答案

这很复杂,但可以在不离开“表达式国度”的情况下完成:

// Get the initial property expression from the left 
// side of the initial lambda. (someObjectThatMightBeNull.Property)
var propertyCall = (MemberExpression)expression.Body;

// Next, remove the property, by calling the Expression
// property from the MemberExpression (someObjectThatMightBeNull)
var initialObjectExpression = propertyCall.Expression;

// Next, create a null constant expression, which will
// be used to compare against the initialObjectExpression (null)
var nullExpression = Expression.Constant(null, initialObjectExpression.Type);

// Next, create an expression comparing the two:
// (someObjectThatMightBeNull == null)
var equalityCheck = Expression.Equal(initialObjectExpression, nullExpression);

// Next, create a lambda expression, so the equalityCheck
// can actually be called ( () => someObjectThatMightBeNull == null )
var newLambda = Expression.Lambda<Func<bool>>(equalityCheck, null);

// Compile the expression.
var function = newLambda.Compile();

// Run the compiled delegate.
var isNull = function();

话虽如此,正如 Andras Zoltan 在评论中 Eloquent 地指出的那样:“仅仅因为你可以并不意味着你应该这样做。”确保您有充分的理由这样做。如果有更好的方法,那就去做吧。 Andras 有一个很好的解决方法。

关于c# - 使用 Expression 调用属性和对象并判断对象是否为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10088727/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com