另一个获取C#中的属性名称(这个是静态的)

miz*_*_sk 3 .net c# reflection

我看了,无处不在有很多例子如何做属性名称解析,但我没有发现这会解决我的用法.

我的想法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; }
}
Run Code Online (Sandbox Code Playgroud)

问题:如果我想这样使用它,如何实现属性名称解析?

Debug.Assert("UserName" == User.GetField(x => x.UserName));
Debug.Assert("LastLoggedOn" == User.GetField(x => x.LastLoggedOn));
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.谢谢.

注意:我可以做var u = new User();,然后u.GetName(() => u.UserName)在我的情况下,我没有实体的实例

编辑1:感谢Darin,我更新了我的代码.我也需要LastLoggedOn工作.

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

InvalidCastException was unhandled
  Unable to cast object of type 'System.Linq.Expressions.UnaryExpression' to type 'System.Linq.Expressions.MemberExpression'.
Run Code Online (Sandbox Code Playgroud)

编辑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");
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

只需<T>GetName静态方法中删除它就可以了(编译器应该先警告过你):

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以写:

string name = User.GetName(x => x.UserName);
Run Code Online (Sandbox Code Playgroud)