如何获取类属性的名称?
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#。以上是关于如何获取类属性的名称?的主要内容,如果未能解决你的问题,请参考以下文章