Coupling properties with friendly names
Hey,
For some time I've been looking for a good way to couple between the property, and it's display name.
Some may say it's a bad practice, but I think sometimes it has it's advantages.
So I solved it using DescriptionAttribute. The class is in System.dll, so we don't need to add any reference.
Let's take a look on the following class:
The usage is very easy:
Some may say it's a bad practice, but I think sometimes it has it's advantages.
So I solved it using DescriptionAttribute. The class is in System.dll, so we don't need to add any reference.
Let's take a look on the following class:
public class UserChecklistEntity
{
public bool TakeTheTour { get; set; }
public int VisitsCount { get; set; }
}
Let's decorate the properties with DescriptionAttributes:
public class UserChecklistEntity
{
[Description("Take the tour")]
public bool TakeTheTour { get; set; }
[Description("Visits count")]
public int VisitsCount { get; set; }
}
And now for the interesting part, add this extension method:
public static class ObjectExtensions
{
public static string GetDescription<T>(this T obj, Expression<Func<T, object>> expression) where T : class
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
if (expression == null)
{
throw new ArgumentNullException("expression");
}
if (expression.NodeType == ExpressionType.Lambda && expression.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)expression.Body;
if (unaryExpression.Operand.NodeType == ExpressionType.MemberAccess && unaryExpression.Operand is MemberExpression)
{
var attribute = ((MemberExpression)unaryExpression.Operand).Member
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.Select(x => x as DescriptionAttribute).FirstOrDefault() ?? new DescriptionAttribute();
return attribute.Description;
}
}
return null;
}
}
For your convenience, because the extension method is on type object, put it in a non commonly used namespace.
The usage is very easy:
static void Main(string[] args)
{
var userChecklistEntity = new UserChecklistEntity();
var takeTheTourDescription = userChecklistEntity.GetDescription(x => x.TakeTheTour);
var visitsCountDescription = userChecklistEntity.GetDescription(x => x.VisitsCount);
Console.WriteLine(takeTheTourDescription);
Console.WriteLine(visitsCountDescription);
}
Hope you find it useful!
Comments
Post a Comment