Actualmente el uso de esta clase cuando necesito esta funcionalidad fuera del proyecto web donde System.Web.Mvc
referencia no debería existir:
namespace Interreg.Domain{
using System;
using System.Linq.Expressions;
public class PropertyName{
public static string For<T>(
Expression<Func<T,object>> expression){
var body=expression.Body;
return GetMemberName(body);
}
public static string For(
Expression<Func<object>> expression){
var body=expression.Body;
return GetMemberName(body);
}
public static string GetMemberName(
Expression expression){
if(expression is MemberExpression){
var memberExpression=(MemberExpression)expression;
if(memberExpression.Expression.NodeType==
ExpressionType.MemberAccess)
return GetMemberName(memberExpression.Expression)+"."+memberExpression.Member.Name;
return memberExpression.Member.Name;
}
if(expression is UnaryExpression){
var unaryExpression=(UnaryExpression)expression;
if(unaryExpression.NodeType!=ExpressionType.Convert)
throw new Exception(string.Format("Cannot interpret member from {0}",expression));
return GetMemberName(unaryExpression.Operand);
}
throw new Exception(string.Format("Could not determine member from {0}",expression));
}
}
}
Lo bueno de este es - no pierde puntos cuando se va más profundo que sólo una nivel.
posible duplicado de [Obtener la propiedad, como una cadena, de una expresión>] (http://stackoverflow.com/questions/2789504/get-the-property-as-a-string-from-an-expressionfunctmodel-tproperty) –
¿Por qué estás reinventando? 'ViewData.ModelMetadata'? –
@Craig Stuntz Realmente no entiendo lo que quiere decir, solo quiero crear un ayudante fuertemente tipado – Omu