加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#:在非泛型类中实现两个抽象列表?

发布时间:2020-12-15 08:21:15 所属栏目:百科 来源:网络整理
导读:对于这个愚蠢的标题感到抱歉,不知道怎么说这个 我正在创建一个具有两个相同类型列表的类.它用于将对第一个列表中的对象的引用复制到第二个列表. 虽然两个列表的类型相同(保持相同类型的对象),但每次初始化此类时它们可能不同. 所以我猜我应该将List类型作为
对于这个愚蠢的标题感到抱歉,不知道怎么说这个

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

虽然两个列表的类型相同(保持相同类型的对象),但每次初始化此类时它们可能不同.

所以我猜我应该将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暴露了“无类型”对象列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读