Использование имен свойств obect строго типизированным способом
Есть ли способ (в C# .NET 4.0), чтобы обеспечить имя свойства объекта строго типизированным способом? Например, если у нас есть объект Person
Public class Person{
public string Name { get; set; }
public int Age { get; set; }
}
И я хочу отправить в другой метод параметры Имя, имя свойства Возраст, но не в виде строки, а строго введите:
SomeMethodThatWantToKnowKeys(Person.Name,Person.Age);
Чего я хочу добиться, так это того, что если кто-то изменит имя свойства, ему придется изменить имена свойств, которые он отправляет в SomeMethodThatWantToKnowKeys. Может быть, отражение? Лучшим способом будет без обновления самого объекта или создания его экземпляра.
2 ответа
Если я понимаю, что вы хотите, вы можете использовать выражения:
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"
Хорошо, так что, хотя есть некоторые уродливые хаки, есть гораздо лучшее и понятное решение. Эта проблема в том, что абстракция не на месте.
Какое имя? Строка? Это может быть 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);
Безопасность типов - удивительная вещь!