如何获取类属性的名称?

Posted

技术标签:

【中文标题】如何获取类属性的名称?【英文标题】:How to get name of a class property? 【发布时间】:2010-10-14 22:01:49 【问题描述】:

无论如何我可以获得类属性的名称IntProperty

public class ClassName

  public static int IntProperty  get  return 0;  


//something like below but I want to get the string of "IntProperty"
ClassName.IntProperty.GetType().Name

基本上我想要做的是将属性名称字符串动态保存到数据库中,然后从数据库中检索它并动态调用属性。

似乎我正在寻找的内容类似于我认为的鸭子打字。

谢谢!

更新:

这是实际代码。这更像是一种工作流程。但是每个任务都被定义为一个类的属性(类用于对任务进行分组)。

public class ApplicationTask

    public static Task<string> SendIncompleteNotification
    
        get
        
            return new Task<string>
                (
                a => Console.WriteLine("Sample Task")
                , "This is a sample task which does nothing."
                );
        
    

因此,代码将能够检索类和属性的全名,例如:namespace.ApplicationTask.SendIncompleteNotification,并将其保存到数据库中。稍后,代码将读取字符串并动态创建任务并将其传递给另一个执行。

【问题讨论】:

相关:***.com/questions/579963/…***.com/questions/301809/… Get method name and type using lambda expression的可能重复 【参考方案1】:

使用 C#6.0 你可以通过

nameof(ClassName.IntProperty)

【讨论】:

这就是我要找的。似乎唯一明智的方法是选择性地绑定到实现 INotifyPropertyChanged 的​​类上的特定属性 这让我的很多代码更容易重构!我的视图模型中有一个 ListCollectionView ,并且设置某些排序的唯一方法是属性名称的字符串版本。 GamesView.SortDescriptions.Add(new SortDescription(nameof(Game.IsFavorited), ListSortDirection.Descending));【参考方案2】:

我认为在这种情况下使用GetProperty方法是多余的,因为您需要知道调用该方法的属性名称。

您可以遍历您的属性并提取其名称:

foreach (PropertyInfo p in typeof(ClassName).GetProperties())

    string propertyName = p.Name;
    //....

【讨论】:

【参考方案3】:

ClassName.IntProperty 的结果只是一个整数值。一旦执行并返回结果,就没有任何迹象表明它来自IntProperty

如果您使用的是 .NET 3.5,则可以改用表达式树,通常通过 lambda 表达式创建:

Expression<Func<int>> exp = () => ClassName.IntProperty;

然后您可以编译并执行表达式分别找出它在做什么(在这种情况下检索IntProperty)。不过,我不确定这是否适合您想要做的事情。

如果您确实想出了如何将属性名称保存在数据库中,那么GetProperty 是检索前线的方法。

如果您可以就如何使用这个问题提供更多背景信息,我们可以提供更多帮助。您只展示了一个表达式 - 如果您可以根据使用它的位置来展示它,那就太好了。

编辑:您已经扩展了属性,但没有扩展它的调用方式。您是否需要直接调用它,而不是仅仅使用Type.GetProperties 获取属性列表并将属性名称列表存储在数据库中?

同样,如果您可以显示调用该属性的代码,以及您希望它如何与数据库交互,我们可能会取得更多进展。

【讨论】:

参见此处(和其他地方)的讨论:***.com/questions/671968/…【参考方案4】:
Type objectType = this.GetType();
PropertyInfo property = objectType.GetProperty("intProperty");
System.Console.Write(property.Name);

这是你需要的吗?

【讨论】:

对不起,这不是我想要的。我已经编辑了帖子以使其更清晰。 如果您决定更改“intProperty”的名称怎么办?你也必须记住改变这一点。恕我直言,在代码库中散布这些魔法字符串是一种不好的做法。正如wintersolider 指出的那样,我强烈建议使用nameof(ClassName.IntProperty) 之类的东西。 要获取属性名称,我们使用的是属性名称字符串 :)。 c# 6 你可以使用 nameof(class.property)。如果你在其他地方重命名属性,那么你肯定会得到 nameof 的编译错误【参考方案5】:

您可以简单地使用nameof(ClassName.IntProperty) 它会给你“IntProperty”

【讨论】:

【参考方案6】:

我遇到了这个,它似乎对获取属性名称很有帮助。 (C++)

#define getVarName(varName,holder) sprintf(holder, "%s", #varName)

int main() 
    int var = 100; // just any type of identifier
    char name[100]; // it will get the variables name
    getVarName(var, name);
    puts(name);
    return 0;

参考:http://zobayer.blogspot.com/2010/05/c-fun-get-variables-name.html

【讨论】:

这个问题明确提到了c#。我建议您发布代码转换,因为 C++ 可能无法轻松转换为 C#。

以上是关于如何获取类属性的名称?的主要内容,如果未能解决你的问题,请参考以下文章

Python如何通过字符或数字动态获取对象的名称或者属性?

java中如何通过反射获取类的属性

如何通过asp.net核心中的属性名称从模型中获取验证属性

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

如何获取属性集名称?

如何根据名称获取属性值