我有一个由IDetail
和IAssembly
项组成的树视图。
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
。
答案 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结构模式,您可以找到代码示例,复制粘贴,文档和类图。