интерфейсная копия свойства в c#

Смотря на членов класса, я сказал бы, что ответ, вероятно, no*. Я не уверен, почему Вы хотели бы сделать это так или иначе, вместо того, чтобы создать Ваш собственный конфигурационный XML-файл.

*That не, исключая грязные отражательные взломы

15
задан opedog 13 August 2009 в 15:55
поделиться

8 ответов

Для этого нет однострочника.

Если вы будете делать это часто, вы можете изучить некоторую форму генерации кода, возможно, используя шаблоны T4 и Reflection.

Кстати, в COBOL есть утверждение для этого: ПЕРЕМЕСТИТЕ СООТВЕТСТВИЕ ДОМАШНЕМУ НА РАБОТУ.

3
ответ дан 1 December 2019 в 00:54
поделиться

Вы можете создать метод расширения:

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;
    //...
}
12
ответ дан 1 December 2019 в 00:54
поделиться

Вот один способ сделать это, не имеющий ничего общего с интерфейсами:

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);
19
ответ дан 1 December 2019 в 00:54
поделиться

Джимми Богард AutoMapper очень полезен для такого рода операций сопоставления.

4
ответ дан 1 December 2019 в 00:54
поделиться

Я не верю, что есть готовое языковое решение для этого (все свойства должны иметь геттеры и сеттеры).

Вы можете создать Address как абстрактный класс с помощью Copy (Добавление адреса).

В качестве альтернативы можно сделать так, чтобы для дома и на работе ИМЕЛИСЬ IAddress, а не расширяли его. Тогда копия будет немедленно.

2
ответ дан 1 December 2019 в 00:54
поделиться

Для этого вам потребуется создать метод

public void CopyFrom(IAddress source)
{
    this.Address1 = source.Address1;
    this.Address2 = source.Address2;
    this.City = source.city;
}
1
ответ дан 1 December 2019 в 00:54
поделиться

У вас может быть конструктор для каждого класса, принимающего IAddress, и реализованные члены, заполненные внутри.

например

public WorkAddress(Iaddress address)
{
    Line1 = IAddress.Line1;
    ...
}

Для удобства обслуживания используйте отражение для получения имен свойств.

HTH,

Dan

0
ответ дан 1 December 2019 в 00:54
поделиться

Если вы выделите общие части домашнего и рабочего адреса в отдельный класс, это может облегчить вашу жизнь. Затем вы можете просто скопировать это свойство. Мне этот дизайн кажется лучшим.

В качестве альтернативы, вы можете создать решение с отражением и атрибутами, где значения свойств одного объекта копируются в соответствующие (и отмеченные) свойства другого. Конечно, это тоже не будет однострочным решением, но оно может быть быстрее и удобнее в обслуживании, чем другие, если у вас большой набор свойств.

0
ответ дан 1 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: