“Display Name” Data Annotation for class using c#

邮差的信 提交于 2019-12-09 12:24:41

问题


I have a class with [Display(Name ="name")] set in the properties, and [Table("tableName"] in the top of the class.

Now I'm using reflection to get some information of this class and I'm wondering if somehow I can add a [Display(Name ="name")] to the class itself.

It will be something like

[Table("MyObjectTable")]
[Display(Name ="My Class Name")]     <-------------- New Annotation
public class MyObject
{
   [Required]
   public int Id { get; set; }

   [Display(Name="My Property Name")]
   public string PropertyName{ get; set; }
}

回答1:


Based on that article I referenced heres a complete example

Declare Custom Attribute

[System.AttributeUsage(System.AttributeTargets.Class)]
public class Display : System.Attribute
{
    private string _name;

    public Display(string name)
    {
        _name = name;        
    }

    public string GetName()
    {
        return _name;
    }
}

Example of use

[Display("My Class Name")]
public class MyClass
{
    // ...
}

Example of reading attribute

public static string GetDisplayAttributeValue()
{
    System.Attribute[] attrs = 
            System.Attribute.GetCustomAttributes(typeof(MyClass)); 

    foreach (System.Attribute attr in attrs)
    {
        var displayAttribute as Display;
        if (displayAttribute == null)
            continue;
        return displayAttribute.GetName();   
    }

    // throw not found exception or just return string.Empty
}



回答2:


There is already an attribute for that in .Net: http://msdn.microsoft.com/en-us/library/system.componentmodel.displaynameattribute.aspx . And yes, you can use it on both: properties and classes (check an AttributeUsageAttribute in Syntax section)




回答3:


Simply write a static function like this:

public static string GetDisplayName<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> expression)
{
    return ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, new ViewDataDictionary<TModel>(model)).DisplayName;
}

And use that like this:

string name = GetDisplayName(Model, m => m.Prop);



回答4:


Based on @amirhossein-mehrvarzi I have used this function:

public static string GetDisplayName(this object model, string expression)
{
    return ModelMetadata.FromStringExpression(expression, new ViewDataDictionary(model)).DisplayName ?? expression;
}

And used that in this example:

var test = new MyObject();

foreach (var item in test.GetType().GetProperties())
{
        var temp = test.GetDisplayName(item.Name)
}

So many options :)



来源:https://stackoverflow.com/questions/17825974/display-name-data-annotation-for-class-using-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!