【问题标题】: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,并将其保存到数据库中。稍后,代码将读取字符串并动态创建任务并将其传递给另一个执行。

【问题讨论】:

标签: c# reflection properties gettype


【解决方案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 获取属性列表并将属性名称列表存储在数据库中?

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

    【讨论】:

    【解决方案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#。
      猜你喜欢
      • 2010-09-14
      • 2014-06-27
      • 1970-01-01
      • 2012-01-09
      • 2012-01-08
      • 2021-12-04
      • 1970-01-01
      • 2017-05-04
      • 2015-09-20
      相关资源
      最近更新 更多