Есть ли способ (в С#.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 или создавать его экземпляр.
Если я понимаю, что вы хотите, вы можете использовать выражения :
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);
Безопасность типов - удивительная вещь!
Method(string name)
сталMethod(string firstname)
когда вы решили, что теперь отправляете имена, а не имена?