【问题标题】:.Net Get property name.Net 获取属性名称
【发布时间】:2010-07-27 08:00:34
【问题描述】:

我想获取一个属性的名称,例如:

Dim _foo As String

Public Property Foo as String
Get
   Return _foo
End Get
Private Set(ByVal value as String)
   _foo = value
End Set

Sub Main()
  Console.Write(Foo.Name)'Outputs "Foo"
End Sub

有什么想法吗?

【问题讨论】:

  • 你想要字符串"Name"

标签: .net


【解决方案1】:

您是指属性还是字段?

有一些巧妙的 lambda 技术可以获取属性的名称 - 这是一个 C# 示例:

String GetPropertyName<TValue>(Expression<Func<TValue>> propertyId)
{
   return ((MemberExpression)propertyId.Body).Member.Name;
}

这样称呼它:

GetPropertyName(() => MyProperty)

它会返回“MyProperty”

不确定这是否是你所追求的。

【讨论】:

  • 当我写这个例子时,我的想法是在别的地方。现在改了
  • 调用示例应该是:MyClass obj = new MyClass(); GetPropertyName(() => obj.MyProperty)
  • 你知道 .NET 2.0 的做法吗?
  • 在 2.0 中,你需要使用反射而不是表达式。
  • 有什么方法可以对当前实例以外的其他类型的属性执行此操作?没有它的实例?
【解决方案2】:

如果您使用的是 C# 6.0(在提出此问题时未发布),您可以使用以下内容:

nameof(PropertyName)

这是在编译时评估并转换为字符串,使用nameof() 的好处是您在重构时不必手动更改字符串。 (nameof 不仅仅适用于属性,CallerMemberName 更严格)

如果您仍然停留在 c# 6.0 之前,那么您可以使用 CallerMemberNameAttribute(它需要 .net 4.5)

private static string Get([System.Runtime.CompilerServices.CallerMemberName] string name = "")
{
    if (string.IsNullOrEmpty(name))
        throw new ArgumentNullException("name");
    return name;
}

【讨论】:

  • 我不知道为什么这没有得到很好的理解,但是这种方法真的很简洁。谢谢
【解决方案3】:
public static PropertyInfo GetPropInfo<T>(this T @object
    , Expression<Action<T>> propSelector)
{
    MemberExpression exp= propSelector.Body as MemberExpression;
    return exp.Member as PropertyInfo;
}

然后像这样使用它:

string str = ....
string propertyName = str.GetPropInfo(a => a.Length).Name;

注意,上面的方法是一个扩展,应该写在一个静态类中,并通过包含命名空间来使用

【讨论】:

  • 或者在 OP 的情况下,在 VB 中它是一个扩展方法,应该在一个模块(不是静态类)中并用 Extension 属性而不是 this 关键字装饰。
【解决方案4】:

通过反射。使用类型的 GetType() 方法,然后查看 GetProperties() 方法和 PropertyInfo 类。 (如果您想检索字符串“propertyName”(对于名为 propertyName 的 field - 如果它是类中的第一个字段,请使用 xxx.GetType().GetFields()[0].Name)。

【讨论】:

  • 这只有在你知道类中属性的索引时才有效,因为类可以更改或可能是部分的,所以这并不是真正可行的。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
相关资源
最近更新 更多