如何从属性中获取属性的名称?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (101)

我正在使用C#4.5和ASP.NETMVC 5。我有以下情况:

[Required(ErrorMessage = "Prop1 is required")]
public string Prop1 { get;set;}

[Required(ErrorMessage = "Prop2 is required")]
public string Prop2 { get;set;}

正如你所看到的,错误消息是属性名称加上“是必需的”字符串。我需要的不是为每个属性键入属性名称和消息,而是使用一个泛型的方法编写器,它将返回修饰属性的名称和我添加的字符串,如下所示:

public string GetMessage()
{
    // Caller property should be a variable that is retrieved dynamically 
    // that holds the name of the property that called the function
    return CallerProperty + " is required";
}

现在我可以用:

[Required(ErrorMessage = GetMessage())]
public string Prop2 { get;set;}

因此,简单地说:我如何才能知道由属性修饰的属性名。

提问于
用户回答回答于

你可以使用“nameof”表达式如下:

class Class1
{
    [CustomAttr("prop Name: " + nameof(MyProperty))]
    public int MyProperty { get; set; }
}

public class CustomAttr : Attribute
{
    public CustomAttr(string test)
    {

    }
}
用户回答回答于

使用反射:

public List<Required> CallerProperty<T>(T source) { List<Required> result = new List<Required>(); Type targetInfo = target.GetType(); var propertiesToLoop = source.GetProperties(); foreach (PropertyInfo pi in propertiesToLoop) { Required possible = pi.GetCustomAttribute<Required>(); if(possible != null) { result.Add(possible); string name = pi.Name; //This is the property name of the property that has a required attribute } } return result; }

这只是一个如何捕获属性上的自定义属性的演示。你必须弄清楚如何管理它们的列表,或者你需要的任何内容,以便生成所需的返回类型。也许用“pi.Name”来映射它?我不知道你需要什么。

扫码关注云+社区

领取腾讯云代金券