gpt4 book ai didi

C# : Implementation of two abstract lists within a non-generic class?

转载 作者:太空狗 更新时间:2023-10-29 21:24:53 26 4
gpt4 key购买 nike

抱歉这个愚蠢的标题,不知道怎么说

我正在创建一个包含两个相同类型列表的类。它用于将对第一个列表中的对象的引用复制到第二个列表。

虽然两个列表的类型相同(包含相同类型的对象),但每次初始化此类时可能会有所不同。

所以我猜我应该将列表类型作为某种抽象列表。我想确保它们在实例化时是强类型的(但如果有问题则不是必需的)。问题出在将所选项目从 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("Need a abstract list type here"), 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 对象,它是一个抽象列表,许多其他对象都继承自该对象,我将使用它。这有点 hack,但由于它不会在开放库中使用,所以我可以接受。否则我会使用通用路由。

最佳答案

我不知道设计者如何使用通用类的用户控件。如果这是一个问题(我猜是这样),摆脱这个问题的一种方法是公开集合 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

明显的缺点是 SetCollectionSubsetCollection公开“未类型化”object列表。

关于C# : Implementation of two abstract lists within a non-generic class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com