对于这个愚蠢的标题感到抱歉,不知道怎么说这个
我正在创建一个具有两个相同类型列表的类.它用于将对第一个列表中的对象的引用复制到第二个列表.
虽然两个列表的类型相同(保持相同类型的对象),但每次初始化此类时它们可能不同.
所以我猜我应该将List类型作为某种抽象列表.我想确保它们在实例化时会被强类型化(但如果有问题,则不是必需的).问题出在将所选项从list1移动到list2的方法内部.抽象列表类型通常没有方法.
我想正常的解决方案是使类通用(className< T> thingy),但我不确定我能做到(至少我不知道如何),因为这个类继承了WPF UserControl.
这是代码:
public partial class SubsetSelectionLists : UserControl { public static DependencyProperty SetCollectionProperty = DependencyProperty.Register("SetCollection",typeof("Need a abstract list type here"),typeof(SubsetSelectionLists)); public static DependencyProperty SubsetCollectionProperty = DependencyProperty.Register("SubsetCollection",typeof(SubsetSelectionLists)); public "Need a abstract list type here" SetCollection { get { return ("Need a abstract list type here") GetValue(SetCollectionProperty); } set { SetValue(SetCollectionProperty,value); } } public "Need a abstract list type here" SubsetCollection { get { return ("Need a abstract list type here")GetValue(SubsetCollectionProperty); } set { SetValue(SubsetCollectionProperty,value); } } public SubsetSelectionLists() { InitializeComponent(); SubsetSelectiongrid.DataContext = this; } private void selectionBtnClick(object sender,RoutedEventArgs e) { SubsetCollection.AddTheseItems(SET.SelecctedItems) } private void removeBtnClick(object sender,RoutedEventArgs e) { SUBSET.RemoveTheseItems(SUBSET.SelectedItem); } }
编辑:解决方案
一些答案向我指出了创建泛型类的最佳解决方案.然而,这在WPF中可能存在问题.您必须跳过顶级泛型类的XAML.
这意味着您可以在类型特定的子类中执行XAML,这不是您想要做的事情(除非只有代码是您可以重复使用但外观是可变的).您也可以使用我想的代码设计控件,但我不确定它的效果如何.
我被指向IList对象,这是一个抽象列表,许多其他人继承并且我将使用它.这是一个黑客攻击,但由于这不会在开放的库中使用,我可以使用它.否则我会使用通用路线.
解决方法
我不知道设计师如何使用通用类的用户控件.如果这是一个问题(我猜它),摆脱它的一种方法是公开集合IList但仍然使用List< T>在运行时构造以在存储中具有类型安全性(代码示例简化为仅包括列表对象创建和用于公开它们的属性;根据需要添加DependencyProperty的代码等):
public class YourControl : UserControl { // this method will set up the internal lists for accepting // objects of the specified type only public void SetListType(Type containedType) { var listType = typeof(List<>).MakeGenericType(new[] { containedType }); SetCollection = (IList)Activator.CreateInstance(listType); SubsetCollection = (IList)Activator.CreateInstance(listType); } public IList SetCollection { get; private set; } public IList SubsetCollection { get; private set; } } // usage example: theControl.SetListType(typeof(string)); theControl.SetCollection.Add("some string"); // works ok theControl.SetCollection.Add(42); // fails,42 is not a string
明显的缺点是SetCollection和SubsetCollection暴露了“无类型”对象列表.