Если вы просто записываете на консоль, т.е. это вывод в стиле отладки, то вам нужен минимальный шанс ошибки опечатки / вставки копии.
Это сбивает с толку под капотом, но очень эффективно на сайтах вызовов:
public static void WriteNameAndValue<T,TValue>(
this TextWriter tw, T t,
Expression<Func<T, TValue>> getter)
{
var memberExpression = getter.Body as MemberExpression;
if (memberExpression == null)
throw new ArgumentException("missing body!");
var member = memberExpression.Member;
tw.Write(member.Name);
tw.Write(": ");
if (member is FieldInfo)
{
tw.Write(((FieldInfo)member).GetValue(t));
}
else if (member is PropertyInfo)
{
tw.Write(((PropertyInfo)member).GetValue(t, null));
}
}
public static void WriteNameAndValueLine<T,TValue>(
this TextWriter tw, T t,
Expression<Func<T, TValue>> getter)
{
WriteNameAndValue<T,TValue>(tw, t, getter);
tw.WriteLine();
}
тогда вы можете написать
t.Foo = "bar";
t.Bar = 32.5;
Console.Out.WriteNameAndValueLine(t, x => x.Foo);
Console.Out.WriteNameAndValueLine(t, x => x.Bar);
// output
// Foo: bar
// Bar: 32.5
Если вы хотите, чтобы это было более настраиваемым во время выполнения с помощью ресурсов и с учетом локализации, вы можете сделать это, но я бы рассмотрел другой, более стандартизированный подход вместо этого, если это было бы вероятным требованием.
P.S. если вы хотите получить фантазию, вы можете заменить переключатель FieldInfo / PropertyInfo на
tw.Write(getter.Compile()(t));
и затем вы также можете проверить наличие MethodInfo в выражении (или разрешить произвольные лямбды и просто вставить номер строки или какой-либо другой общий текст. Я предлагаю не идти по этому маршруту, использование уже сбивает с толку, так как это может привести к нежелательным загрузить то, что должно быть простым методом регистрации.