【发布时间】:2011-07-08 14:59:04
【问题描述】:
我遇到了一个问题,我尝试将一个泛型转换为另一个泛型,其中第二个泛型 T 参数是第一个中使用的 T 参数的子类。
这是我的代码,为了便于理解而简化...
public partial class HierarchicalItem
{
public ObservableHierarchicalCollection<HierarchicalItem> ContainingCollection{ get; private set; }
public HierarchicalItem Parent{ get{
return (ContainingCollection != null)
? ContainingCollection.Owner
: null;
}}
}
public partial class HierarchicalItem
{
public class ObservableHierarchicalCollection<T> : ObservableCollection<T>
where T : HierarchicalItem
{
public ObservableHierarchicalCollection(HierarchicalItem owner)
{
this.Owner = owner;
}
public HierarchicalItem Owner{ get; private set; }
private void ExistingMemberCheck(T item)
{
if(item.ContainingCollection != null) throw new ExistingMemberException();
item.ContainingCollection = this; // <-- This fails because of casting
}
protected override void InsertItem(int index, T item)
{
ExistingMemberCheck(item);
base.InsertItem(index, item);
}
protected override void SetItem(int index, T item)
{
CheckParent(item);
// Get the item and unhook the hierarchy
var existingItem = this[index];
existingItem.ContainingCollection = null;
base.SetItem(index, item);
}
protected override void RemoveItem(int index)
{
// Get the item and unhook the hierarchy
var existingItem = this[index];
existingItem.ContainingCollection = null;
base.RemoveItem(index);
}
}
}
那么我该如何解决呢?
【问题讨论】:
-
@Magnus,不是重复的。他说的是会员。我说的是收藏本身。另外,我专门指的是所有可能显示这一点的泛型,仅以我的代码为例。他专注于列表及其内容。 (IOW,我可以用非基于集合的类来证明这一点。)