gpt4 book ai didi

c# - 使用反射获取属性的字符串名称

转载 作者:IT王子 更新时间:2023-10-29 03:52:46 26 4
gpt4 key购买 nike

有大量的反射示例可以让您获得:

  1. 类中的所有属性
  2. 单个属性,前提是您知道字符串名称

有没有办法(使用反射、TypeDescriptor 或其他方式)在运行时获取类中属性的字符串名称,前提是我只有类和属性的实例?

我有一个类的实例,它具有我想要获取字符串名称(而不是 getter/setter)的属性(以及其他属性)。我需要使用反射对该属性做一些工作,但不想维护带有硬编码字符串名称的代码,以防我重构属性名称。因此,我想以编程方式获取属性的名称。

我知道我可以使用反射轻松获取类中的所有属性,然后获取每个属性的名称。我要的是一个函数,只要我将属性的实例传递给我,就可以给我一个属性的名称。换句话说,如何从 class.GetType().GetProperty(myProperty) 返回给我的 PropertyInfo[] 数组中找到我想要的属性,以便我可以从中获取 PropertyInfo.Name 吗?

最佳答案

如果您已经有一个PropertyInfo,那么@dtb's answer使用 PropertyInfo.Name 是正确的方法。但是,如果您想找出您当前所在的属性代码,则必须遍历当前调用堆栈以找出您当前正在执行的方法并从那里派生属性名称。

var stackTrace = new StackTrace();
var frames = stackTrace.GetFrames();
var thisFrame = frames[0];
var method = thisFrame.GetMethod();
var methodName = method.Name; // Should be get_* or set_*
var propertyName = method.Name.Substring(4);

如果您没有 PropertyInfo 对象,您可以从属性 expression 中获取它,如下所示:

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}

要使用它,您需要编写如下内容:

var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"

关于c# - 使用反射获取属性的字符串名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661824/

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