Это самая лаконичная форма, которую я могу придумать, не переходя к рефлексии, но она включает повторяющиеся имена свойств, поэтому я не уверен, что это именно то, что вам нужно.
public static void MapTo<TObject>(this TObject source, TObject target, params Action<TObject, TObject>[] properties)
{
foreach (var property in properties)
{
property(source, target);
}
}
Называется как:
void Copy(FooBar source, FooBar target)
{
source.MapTo(target, (s,t) => t.Foo = s.Foo,
(s,t) => t.Bar = s.Bar,
(t,s) => t.Baz = s.Baz);
}
class FooBar
{
public string Foo { get; set; }
public string Bar { get; set; }
public string Baz { get; set; }
}
Однако, это более многословно, чем просто:
void Copy(FooBar source, FooBar target)
{
target.Foo = source.Foo;
target.Bar = source.Bar;
target.Baz = source.Baz;
}
Что-нибудь еще происходит в вашей копии, что делает последний пример недействительным? Если нет, то я бы просто все упростил и пошел на это.