将当前类型转换为其继承的类型

时间:2015-09-23 13:15:50

标签: c# interface type-conversion

我有一个由IDetailIAssembly项组成的树视图。

public interface IDetail {
    string Nomenclature { get; set; }
    string Cost { get; set; }
}
public interface IAssembly:IDetail{
    IEnumerable<IDetail> DirectChildren { get; }
    IEnumerable<IDetail> LoadChildren();
}

我正在添加将childen插入树中的功能。我可以将IDetail子项添加到IAssembly就好了但想要包含将子项添加到IDetail的功能。这意味着我需要将IDetail转换为IAssembly,以便它可以有子女。

假设我在IDetail内工作,如何将IAssembly投射到IDetail。我可以将object我投入IAssembly吗? this仅为get,我无法设置this=(IAssembly)this;

感谢阅读,

更新 让我澄清一下我的问题..我不想将孩子添加到IDetail但是如果用户决定更多地分出当前项目,那么类型IDetail的当前项目将切换到IAssembly,然后在孩提时添加IDetail

4 个答案:

答案 0 :(得分:0)

您可以在MSDN上查看协方差和ContraVariance(或CounterVariance)This is the article on MSDN

如果放在DirectChildren中的对象是IDetail,则无法将其转换为IAssembly,但如果放在DirectChildren中的对象是IAssembly,则可以使用其方法将Directchildren元素转换为IAssembly以使用它方法

答案 1 :(得分:0)

如果您需要为IDetail类型和IAssembly类型添加子项,您可以尝试将与子项相关的代码(字段和方法)移到IDetail而不是IAssembly

<强>更新 您应该能够简单地创建一个新的IAssembly对象并将当前IDetail对象添加为子对象,而不是将同一对象强制转换为新类型。然后,您必须使用新的IDetail对象替换树视图中的IAssembly对象。

答案 2 :(得分:0)

class Program
   {
        public static void Main()
        {
            Program P = new Program(); //Creating an instance.
            IAssembly iAssebly = ((IAssembly)P); //Casting it to IAssembly.
            IDetail iDetail = ((IDetail)P); //Casting it to IDetail.

            IAssembly iDetailToIAssembly = ((IAssembly)iDetail); //Casting IDetail to IAssemmbly.
            IDetail iAssemblyToIDetail = ((IDetail)iAssebly); //Casting IAssemmbly to IDetail.
        }

    }

答案 3 :(得分:0)

我建议您使用Composite Pattern,它的gof结构模式,您可以找到代码示例,复制粘贴,文档和类图。

link:http://www.dofactory.com/net/composite-design-pattern