gpt4 book ai didi

.net - 通过 linq 表达式从覆盖的属性获取属性

转载 作者:行者123 更新时间:2023-12-04 15:25:37 26 4
gpt4 key购买 nike

我正在尝试使用 GetCustomAttributes()获取在属性上定义的属性。问题是该属性是一个被覆盖的属性,我无法弄清楚如何从表达式中提取被覆盖的属性。我只能弄清楚如何获得基类的一个。

这是一些代码

public class MyAttribute : Attribute 
{
//...
}

public abstract class Text
{
public abstract string Content {get; set;}
}

public class Abstract : Text
{
[MyAttribute("Some Info")]
public override string Content {get; set;}
}

现在我正在尝试获取 MyAttribute脱离抽象类。但我需要通过 Expression 获得它.这是我一直在使用的:
Expression<Func<Abstract, string>> expression =  c => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;

var attrs = Attribute.GetCustomAttributes(memberType, true);

不幸的是 atts最终为空。问题是 menberType最终被用于 Text.Content而不是 Abstract.Content类(class)。所以当我得到属性时,它什么都不返回。

最佳答案

它不起作用,因为 MemberExpression忽略覆盖并返回基本类型的属性 Text这就是为什么你没有找到你的属性。

您可以在此处阅读有关此问题的信息:How to get the child declaring type from an expression?

但是,您拥有表达式中的所有信息,并且可以通过更多反射(快速和脏样本)获得您的属性:

Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;

var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name));

关于.net - 通过 linq 表达式从覆盖的属性获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324842/

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