【问题标题】:Initialize a collection with a type from another collection用另一个集合中的类型初始化一个集合
【发布时间】:2015-11-12 20:25:13
【问题描述】:

这可能是不可能的情况,我可能正在尝试做一些我一开始不应该做的事情,但它就是这样。

  • 我有一个自定义 WPF 控件,它有两个 IEnumerable 集合
  • 第一个集合 (ItemsSource) 通过 XAML 声明,可以是任何类型的对象。
  • 我正在实现的第二个集合又是一个 IEnumerable,我想将其初始化为 ObservableCollection。
  • 这是我的问题,因为我受到限制,两个集合都属于同一类型的对象(不,我不能将对象用作类型)。例如,ItemsSource 是“MyItem”类型的对象,我想将第二个集合初始化为 ObservableCollection()。

这可能吗?我在做我不应该做的事情吗?任何提示将不胜感激。附带说明一下,如果我通过 XAML 传递第二个集合,一切都很好,但我不想将这样的限制添加到我正在实现的功能中。

编辑:

这里有一些代码 sn-ps 来展示这个场景: 第一个集合,注意这个集合继承自System.Windows.Controls.ItemsControl类:

public IEnumerable ItemsSource { get; set; }

第二集:

public IEnumerable SelectedItems
{
    get
    {
        this.InitializeSelectedItemsCollectionIfRequired();
        return (IEnumerable)GetValue(SelectedItemsProperty);
    }
    set
    {
        SetValue(SelectedItemsProperty, value);
    }
}

private void InitializeSelectedItemsCollectionIfRequired()
{
    if (this.GetValue(SelectedItemsProperty) == null)
    {
        // Here is where I want to initialize the second collection if it was not already set in via a Binding in the XAML
        this.SelectedItems = new System.Collections.ObjectModel.ObservableCollection<"dont know how to pass correct type here">();
    }
}

【问题讨论】:

  • 也许一些关于这两个集合的小sn-ps代码可能会有所帮助?
  • 抱歉,在我的帖子中添加了几行我目前正在调试的内容,

标签: c# wpf


【解决方案1】:

由于您不知道确切的类型,您可以简单地恢复为最基本的类型object

this.SelectedItems = new System.Collections.ObjectModel.ObservableCollection<object>();

【讨论】:

  • 是的,我想通了,它是 100% 正确的,但是我有一个限制,即对象是不够的,我需要对象的“真实”类型。这是遗留代码的限制,如果它们不包含相同类型的对象,则基本上无法同步两个集合。
  • 它们是否共享任何满足您需求的基本类型或接口?如果控件基于类型,我有点不清楚它是如何工作的。肯定有什么,某处有类型的知识?
  • 嗨,奥利弗,在我写这封邮件的时候,我明白我担心我想做的事情在 C# 中技术上是不可能的。在 C# 中声明将在运行时确定的类型的集合是不可能的,或者至少不是一个好的做法。我认为我必须做的是重构遗留代码,以某种方式施加如此“大”的限制,使我能够简单地为对象使用基类,而不是在运行时确定它们的特定类型。感谢您的评论,我暂时将其标记为已回答。
  • 不幸的是,您可能是对的,泛型是在编译时解释的。正如您所说,虽然有解决“问题”的方法,但它们通常起源于解决更大设计问题的权宜之计。就我个人而言,如果一个数字类型“共享”一个集合,那么应该有一些基本类型或接口来描述在代码库的其余部分中以通用方式使用的通用功能。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
相关资源
最近更新 更多