var person = new Person();
Do(person.Firstname);
static void Do(object prop)
{
//find out "Firstname"...
}
我想找到一个属性的名称,我无权访问到其父对象(如上所述)。有可能吗?
答案 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);
}
}