C#中的另一个get属性名称(此名称是静态的)

C#中的另一个get属性名称(此名称是静态的),c#,.net,reflection,C#,.net,Reflection,我看了很多关于如何解析属性名的例子,但我没有发现这能解决我的使用问题 我对User的想法如下: class Entity<T> where T : class { public static String GetName<T>(Expression<Func<T, object>> expr) { return ((MemberExpression)expr.Body).Member.Name; } } c

我看了很多关于如何解析属性名的例子,但我没有发现这能解决我的使用问题

我对
User
的想法如下:

class Entity<T> where T : class
{
    public static String GetName<T>(Expression<Func<T, object>> expr)
    {
        return ((MemberExpression)expr.Body).Member.Name;
    }
}

class User : Entity<User>
{
    public String UserName { get; set; }
    public DateTime LastLoggedOn { get; set; }
}
任何帮助都将不胜感激。谢谢

注意:我可以做
var u=new User()
然后
u.GetName(()=>u.UserName)
但是在我的例子中,我没有实体的实例

编辑1:多亏了达林,我更新了代码。我也需要做
LastLoggedOn
工作

调试显示,
expr
的值是
{x=>Convert(x.LastLoggedOn)}
(不知道转换意味着什么)

编辑2/回答:经过一些调试,我编写了这个“解决方案”。我不喜欢它,但它似乎管用

public static string GetName(Expression<Func<T, object>> expression)
{
    MemberExpression memberExp = expression.Body as MemberExpression;
    if (memberExp != null)
        return memberExp.Member.Name;

    // for DateTime
    UnaryExpression unaryExp = expression.Body as UnaryExpression;
    if (unaryExp != null)
    {
        memberExp = unaryExp.Operand as MemberExpression;
        if (memberExp != null)
            return memberExp.Member.Name;
    }

    throw new ArgumentException("'expression' should be a member expression or a method call expression.", "expression");
}
公共静态字符串GetName(表达式)
{
MemberExpression memberExp=expression.Body作为MemberExpression;
if(memberExp!=null)
返回memberExp.Member.Name;
//日期时间
UnaryExpression-unaryExp=expression.Body作为UnaryExpression;
如果(unaryExp!=null)
{
memberExp=unaryExp.Operator作为MemberExpression;
if(memberExp!=null)
返回memberExp.Member.Name;
}
抛出新ArgumentException(“'expression'应该是成员表达式或方法调用表达式。”,“expression”);
}
只要从
GetName
静态方法中删除
,就可以开始了(顺便说一句,编译器应该已经警告过你了):


您可以在
实体
上调用静态方法:

string name=Entity.GetName(u=>u.UserName);

您已经将方法和类都设置为泛型,它们都采用了类型参数。您可能只希望该类是泛型的,因为它看起来就是您使用它的方式。

不清楚您实际想要做什么。请详细说明。-1谁否决了这个问题。对不起,我已经更新了这个问题。好的,我删除了,它可以工作了。你能看看它为DateTime抛出的异常吗?
InvalidCastException was unhandled
  Unable to cast object of type 'System.Linq.Expressions.UnaryExpression' to type 'System.Linq.Expressions.MemberExpression'.
public static string GetName(Expression<Func<T, object>> expression)
{
    MemberExpression memberExp = expression.Body as MemberExpression;
    if (memberExp != null)
        return memberExp.Member.Name;

    // for DateTime
    UnaryExpression unaryExp = expression.Body as UnaryExpression;
    if (unaryExp != null)
    {
        memberExp = unaryExp.Operand as MemberExpression;
        if (memberExp != null)
            return memberExp.Member.Name;
    }

    throw new ArgumentException("'expression' should be a member expression or a method call expression.", "expression");
}
public class Entity<T> where T : class
{
    public static string GetName(Expression<Func<T, object>> expr)
    {
        return ((MemberExpression)expr.Body).Member.Name;
    }
}

public class User: Entity<User>
{
    public String UserName { get; set; }
}
string name = User.GetName(x => x.UserName);
string name = Entity<User>.GetName<User>(u => u.UserName);