Использование имен свойств 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);

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

Другие вопросы по тегам