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

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

Я хотел бы узнать имя свойства, , где у меня нет доступа к родительского объекта (человек, как указано выше). Является ли это возможным?Получить имя собственности

+1

Вы хотите узнать «имя» человека или вам в основном нужна строка '' Firstname "'? – devRicher

+1

У вас должен быть отдельный параметр для «name». Ничто не мешает кому-то пройти «Do (4)», и в этом случае нет «имени» для получения. –

+1

Если вы добавите то, для чего вам нужно имя, возможно, вы получите ответ, который действительно полезен. –

ответ

1

Нет, это невозможно. Ваш Person.Firstname - это только значение. Это значение ничего не знает о местонахождении или происхождении кода.

+0

По вашей логике передача 'int x' в функцию не позволяет обнаружить, что это' int'. – devRicher

+3

@devRicher: Это совсем не то же самое. 'Firstname' - это строка. Вот и вся функция 'Do' может знать об этом. Он не знает, что это строка, которая является свойством 'Person' под названием' Firstname'. Это то, что хочет знать ОП. Это нужно было бы передать отдельно. –

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


} 
Смежные вопросы