Смотря на членов класса, я сказал бы, что ответ, вероятно, no*. Я не уверен, почему Вы хотели бы сделать это так или иначе, вместо того, чтобы создать Ваш собственный конфигурационный XML-файл.
*That не, исключая грязные отражательные взломы
Для этого нет однострочника.
Если вы будете делать это часто, вы можете изучить некоторую форму генерации кода, возможно, используя шаблоны T4 и Reflection.
Кстати, в COBOL есть утверждение для этого: ПЕРЕМЕСТИТЕ СООТВЕТСТВИЕ ДОМАШНЕМУ НА РАБОТУ.
Вы можете создать метод расширения:
public static void CopyAddress(this IAddress source, IAddress destination)
{
if (source is null) throw new ArgumentNullException("source");
if (destination is null) throw new ArgumentNullException("destination");
//copy members:
destination.Address1 = source.Address1;
//...
}
Вот один способ сделать это, не имеющий ничего общего с интерфейсами:
public static class ExtensionMethods
{
public static void CopyPropertiesTo<T>(this T source, T dest)
{
var plist = from prop in typeof(T).GetProperties() where prop.CanRead && prop.CanWrite select prop;
foreach (PropertyInfo prop in plist)
{
prop.SetValue(dest, prop.GetValue(source, null), null);
}
}
}
class Foo
{
public int Age { get; set; }
public float Weight { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format("Name {0}, Age {1}, Weight {2}", Name, Age, Weight);
}
}
static void Main(string[] args)
{
Foo a = new Foo();
a.Age = 10;
a.Weight = 20.3f;
a.Name = "Ralph";
Foo b = new Foo();
a.CopyPropertiesTo<Foo>(b);
Console.WriteLine(b);
}
В вашем случае, если вы хотите скопировать только один набор свойств интерфейса, вы можете сделать это:
((IAddress)home).CopyPropertiesTo<IAddress>(b);
Джимми Богард AutoMapper очень полезен для такого рода операций сопоставления.
Я не верю, что есть готовое языковое решение для этого (все свойства должны иметь геттеры и сеттеры).
Вы можете создать Address как абстрактный класс с помощью Copy (Добавление адреса).
В качестве альтернативы можно сделать так, чтобы для дома и на работе ИМЕЛИСЬ IAddress, а не расширяли его. Тогда копия будет немедленно.
Для этого вам потребуется создать метод
public void CopyFrom(IAddress source)
{
this.Address1 = source.Address1;
this.Address2 = source.Address2;
this.City = source.city;
}
У вас может быть конструктор для каждого класса, принимающего IAddress, и реализованные члены, заполненные внутри.
например
public WorkAddress(Iaddress address)
{
Line1 = IAddress.Line1;
...
}
Для удобства обслуживания используйте отражение для получения имен свойств.
HTH,
Dan
Если вы выделите общие части домашнего и рабочего адреса в отдельный класс, это может облегчить вашу жизнь. Затем вы можете просто скопировать это свойство. Мне этот дизайн кажется лучшим.
В качестве альтернативы, вы можете создать решение с отражением и атрибутами, где значения свойств одного объекта копируются в соответствующие (и отмеченные) свойства другого. Конечно, это тоже не будет однострочным решением, но оно может быть быстрее и удобнее в обслуживании, чем другие, если у вас большой набор свойств.