2016-12-05 78 views
-2
var person = new Person(); 
Do(person.Firstname); 

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

我想找出一個屬性,的名字,我都進不去其父對象(人如上)的名字。可能嗎?獲得的財產

+1

你想知道這個人的名字嗎?或者你基本上需要一個字符串「Firstname」嗎? – devRicher

+1

您必須爲「名稱」設置單獨的參數。沒有任何東西阻止某人傳遞'Do(4)',在這種情況下,沒有「名字」可以獲得。 –

+1

如果你添加了你需要的名字,也許你可以得到一個實際上有用的答案。 –

回答

1

不,這是不可能的。您的Person.Firstname只是一個價值。該值對代碼中的位置或來源一無所知。

+0

通過你的邏輯,將'int x'傳遞給一個函數使得不可能發現它是一個'int'。 – devRicher

+3

@devRicher:完全不一樣。 'Firstname'是一個字符串。這就是'Do'可以知道的所有功能。它不知道它是一個字符串,恰好是名爲'Firstname'的'Person'的屬性。 OP想知道的是什麼。那必須分開通過。 –

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 
} 
+0

好的,謝謝!它可能工作,如果沒有別的可能,我會檢查它... – dbol

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); 
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); 
    } 


}