如何在Interface派生类型之间进行转换?

时间:2011-01-18 17:11:08

标签: c# derived-types

最简单的就是我想做的事情:

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 个答案:

答案 0 :(得分:2)

你可以添加一个构造函数,比如DerivedB,它将InterfaceA作为参数。

E.g。

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 :(得分:1)

我想我不知道你在做什么。为什么不直接为DerivedA和DerivedB声明构造函数,这些构造函数采用InterfaceA进行初始化?它会更简单,更灵活,因为每个派生类型都负责从接口类型初始化自身。您可以稍后添加更多实现该接口的类型,并且其他类可以使用它们而无需进一步更改。

答案 2 :(得分:0)

您需要为两个派生类实现operator overloading