Использование имен свойств obect строго типизированным способом

1

Есть ли способ (в С#.Net 4.0) для предоставления имени свойства объекта в стиле с типом? Например, если у нас есть объект Person

Public class Person{
    public string Name { get; set; }
    public int Age { get; set; }
    }

И я хочу отправить другому методу параметры Name, имя свойства Age, но не как строку, но сильно напечатать:

SomeMethodThatWantToKnowKeys(Person.Name,Person.Age);

Я хочу добиться того, что если кто-то изменит имя свойства, ему придется изменить имена свойств, которые он отправляет в "SomeMethodThatWantToKnowKeys". Может быть, отражение? Лучший способ - не обновлять объект itsef или создавать его экземпляр.

  • 0
    пожалуйста, будьте более конкретны и уточните свой вопрос, трудно проследить, что вы ищете.
  • 0
    Вы говорите, что хотите, чтобы Method(string name) стал Method(string firstname) когда вы решили, что теперь отправляете имена, а не имена?
Показать ещё 6 комментариев
Теги:
reflection

2 ответа

3

Если я понимаю, что вы хотите, вы можете использовать выражения :

void SomeMethod<T>(Expression<Func<T>> expr)
{
    var memberExpr = expr.Body as MemberExpression;
    Console.WriteLine("{0}: {1}", memberExpr.Member.Name, expr.Compile()());
}

var person = new { Name = "John Doe", Age = 10 };
SomeMethod(() => person.Name); // prints "Name: John Doe"
SomeMethod(() => person.Age);  // prints "Age: 10"
  • 0
    Я видел этот вопрос во многих вариациях, поэтому я инкапсулировал его в посте вопросов и ответов здесь - stackoverflow.com/questions/32310767/… Кроме того, я использовал ваш ответ для GetPropertyName и отдал вам должное ..
3

Хорошо, так что пока есть некоторые уродливые хаки, есть намного лучшее и понятное решение. Эта проблема связана с тем, что абстракция отсутствует.

Что такое имя? Строка? Это может быть int, double, char, float.... что-нибудь... вы действительно не заботитесь о базовом типе. Вы заботитесь о концепции или понятии имени. Я знаю, что это немного глубже, но этот опыт поможет вам с хорошим дизайном.

Вот что я предлагаю сейчас, но лично я мог бы сделать больше.

public class PersonName
{
    public String Name { get; set; }
}

public class PersonAge
{
    public int Age {get;set;}
}

public class Person
{ 
    public PersonName PersonName {get;set;}
    public PersonAge PersonAge {get;set;}
}

Итак, теперь ваша подпись метода:

    SomeMethodThatWantToKnowKeys(PersonName,PersonAge);

Безопасность типов - удивительная вещь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню