Как конвертировать между производными типами интерфейса? - PullRequest
1 голос
/ 18 января 2011

Самое простое, что я хочу сделать:

interface InterfaceA
{
    string var1 { get; set; }
    string var2 { get; set; }
}

public class DerivedA : InterfaceA
{
    public string var1 { get; set; }
    public string var2 { get; set; }
}

public class DerivedB : InterfaceA
{
    public string var1 { get; set; }
    public string var2 { get; set; }
}

public class DoEverything
{
    InterfaceA A = new DerivedA();
    InterfaceA B = new DerivedB();

    A.var1 = "Test1";
    A.var2 = "Test2";

    B = ConvertObject<DerivedB>(A);

    write(B.var1 + ", " + B.var2);

    // This doesn't work, I would like it to though.
    public T ConvertObject<T>(object obj)
    {
        T result = (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });

        foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
        {
            if (propertyInfo.CanRead)
            {
                try
                {
                    object value = propertyInfo.GetValue(obj, null);
                    propertyInfo.SetValue(result, value, null);
                }
                catch { }
            }
        }

        return result;
    }
}

Сейчас мне нужно вручную конвертировать каждое свойство в моих объектах, и когда добавляется новое свойство, я должен помнить, что нужно перейти к методам преобразования и добавить его. Я бы предпочел, чтобы это было сделано автоматически.

Любая помощь будет принята с благодарностью.

спасибо заранее

Ответы [ 3 ]

2 голосов
/ 18 января 2011

Вы можете добавить конструктор, скажем, к DerivedB, который принимает в качестве аргумента InterfaceA.

* 1003 Е.Г. *

public class DerivedB : InterfaceA
{
    public string var1 { get; set; }
    public string var2 { get; set; }
    public DerivedB(InterfaceA original)
    {
       var1 = original.var1;
       var2 = original.var2;
    }
}

Тогда вы можете использовать его так:

public class DoEverything
{
    InterfaceA A = new DerivedA();

    A.var1 = "Test1";
    A.var2 = "Test2";

    InterfaceA B = new DerivedB(A);
    write(B.var1 + ", " + B.var2);
}
1 голос
/ 18 января 2011

Думаю, я не знаю, к чему ты клонишь. Почему бы вам просто не объявить конструкторы для DerivedA и DerivedB, которые принимают InterfaceA для инициализации? Это будет проще и гибче, поскольку каждый производный тип будет отвечать за инициализацию себя из типа интерфейса. Позже вы можете добавить больше типов, которые реализуют интерфейс, и они будут использоваться другими классами без каких-либо дальнейших изменений.

0 голосов
/ 18 января 2011

Вам необходимо реализовать перегрузку операторов для обоих производных классов:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...