gpt4 book ai didi

c# - 表达式 `t => (t.SomeProperty As Object)` 指的是方法,而不是属性

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:00 26 4
gpt4 key购买 nike

我在一些代码中创建了这个表达式:

t => (t.SomeProperty As Object)

现在我试图通过这个小片段(很长一段时间从互联网上获得)来获取属性名称(SomeProperty):

    public static PropertyInfo GetPropertyInfo<TSource, TProperty>
(TSource source, Expression<Func<TSource, TProperty>> propertyLambda) {
var type = typeof(TSource);

var member = propertyLambda.Body as MemberExpression;
if (member == null)
throw new ArgumentException($"Expression '{propertyLambda}' refers to a method, not a property.");

var propInfo = member.Member as PropertyInfo;
if (propInfo == null)
throw new ArgumentException($"Expression '{propertyLambda}' refers to a field, not a property.");

if (type != propInfo.ReflectedType && !type.IsSubclassOf(propInfo.ReflectedType))
throw new ArgumentException($"Expresion '{propertyLambda}' refers to a property that is not from type {type}.");

return propInfo;
}

但是如您所知,propertyLambda.Body as MemberExpression 始终为 null,原因是:t => (t.Some1 As Object) 不是属性引用.在这种情况下,有什么方法可以获取属性名称吗?

最佳答案

C# as 运算符转换为 Expression.TypeAs , 和 C# 转换运算符转换为 Expression.ConvertExpression.ConvertChecked .如您所见,它们都是 UnaryExpression 类型,因此您可以使用 Operand 提取操作数表达式属性(property)。您可以在循环中执行此操作以支持多次转换。

付诸行动,替换

var member = propertyLambda.Body as MemberExpression;

var operand = propertyLambda.Body;
while (operand.NodeType == ExpressionType.TypeAs || operand.NodeType == ExpressionType.Convert || operand.NodeType == ExpressionType.ConvertChecked)
operand = ((UnaryExpression)operand).Operand;
var member = operand as MemberExpression;

关于c# - 表达式 `t => (t.SomeProperty As Object)` 指的是方法,而不是属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863529/

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