获取财产的名称

时间:2016-12-05 20:52:31

标签: c#

var person = new Person();
Do(person.Firstname);

static void Do(object prop)
{
    //find out "Firstname"...
}

我想找到一个属性的名称,我无权访问到其父对象(如上所述)。有可能吗?

4 个答案:

答案 0 :(得分:1)

不,这是不可能的。您的Person.Firstname只是一个值。该值对代码中的位置或原点一无所知。

答案 1 :(得分:1)

在C#6中,您可以使用nameof,但在将其传递给Do之前,您必须先使用它:

Do(nameof(person.Firstname));

static void Do(object prop)
{
    // prop is the string Firstname
}

如果您需要值和名称,则必须将两者作为单独的参数传递:

Do(person.FirstName, nameof(person.Firstname));

static void Do(object prop, string name)
{
    // name is the string Firstname
    // prop is the value of person.Firstname
}

答案 2 :(得分:0)

也许这样的方法可以帮助你:

static void Do<TEntity, TProp>(TEntity entity, Expression<Func<TEntity, TProp>> property)
{
    var member = property.Body as MemberExpression;

    if (member != null)
    {
        var propertyName = member.Member.Name;
        var propertyValue = property.Compile()(entity);

        //Do something.
    }
}

然后你就能做到这样的事情:

Do(person, p => p.FirstName);
Do(person, p => p.LastName);

答案 3 :(得分:0)

无法使用属性实际执行此操作,但您可以使用方法执行此操作,包括具有该属性的方法。例如

class Person
{
    public string GetName() { return "John Doe"; }
}

class Program
{
    static void Main(string[] args)
    {
        var p = new Person();
        Do(p.GetName);  //Notice no () after GetName
    }


    static void Do(Func<string> f)
    {
        Console.WriteLine(String.Format("The caller sent the value '{0}' via a method named {1}", f.Invoke(), f.Method.Name);
    }


}