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

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

Ich möchte den Namen einer Eigenschaft erfahren, wo ich (wie oben Person) keinen Zugang zu seinem übergeordneten Objekt haben. Ist es möglich?Name der Immobilie Get

+1

Möchten Sie den 'Firstname' der Person herausfinden oder benötigen Sie grundsätzlich eine Zeichenfolge' "Vorname" '? – devRicher

+1

Sie müssten einen separaten Parameter für den "Namen" haben. Es gibt nichts, was jemanden davon abhält, 'Do (4)' zu passieren, in welchem ​​Fall es keinen "Namen" zu erhalten gibt. –

+1

Wenn Sie hinzufügen, was Sie für den Namen benötigen, können Sie möglicherweise eine Antwort erhalten, die tatsächlich hilfreich ist. –

Antwort

1

Nein, das ist nicht möglich. Ihr Person.Firstname ist nur ein Wert. Dieser Wert weiß nichts über seine Position oder Herkunft im Code.

+0

Wenn man 'int x' in eine Funktion übergibt, kann man unmöglich herausfinden, dass es sich um ein' int' handelt. – devRicher

+3

@devRicher: Das ist nicht das Gleiche. 'Vorname' ist eine Zeichenfolge. Das ist die Funktion, über die 'Do' Bescheid wissen kann. Es weiß nicht, dass es sich um eine Zeichenfolge handelt, die zufällig eine Eigenschaft von 'Person' namens' Vorname' ist. Welches möchte das OP wissen? Das müsste getrennt passieren. –

1

In C# 6 Sie nameof verwenden können, aber Sie würden es zu benutzen, bevor Sie es Do passieren:

Do(nameof(person.Firstname)); 

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

Wenn Sie den Wert und den Namen benötigen, würden Sie beide passieren müssen als separate Argumente:

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

Ok danke! Es könnte funktionieren, wenn nichts anderes möglich ist, werde ich es überprüfen ... – dbol

0

Vielleicht ein Ansatz wie diese können Ihnen helfen:

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. 
    } 
} 

Dann würden Sie in der Lage sein, solche Dinge zu tun:

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

Kann nicht wirklich mit einer Eigenschaft zu tun, aber man kann es mit einem Verfahren tun, einschließlich eines Verfahrens, mit genau das tut, was die Eigenschaft der Fall ist. Zum Beispiel

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


}