如何转换和操作未知类型的ObservableCollection

时间:2016-06-23 18:37:21

标签: wpf generics casting observablecollection

(使用.Net版本4.0)我正在尝试为AttachedProperty创建一个WPF DataGrids。该属性将使用一种方法将网格ItemSource中的项目从一个索引移动到另一个索引。它假定网格的源集合是ObservableCollection,这对我来说是安全的。我的计划是将ItemSource投射到ObservableCollection,然后使用该集合的Move方法。

但是...... ObservableCollection是通用的,没有基类/接口,那么我将转换为? type参数与此方法无关,但也未知,因为它适用于任何DataGrid。我可以一直到Ilist,使用RemoveInsert,但这可能会不必要地引发我要避免的INotifyCollectionChanged事件。

1 个答案:

答案 0 :(得分:2)

由于ObservableCollection<T>.Move()没有T类型的任何参数,您可以咬住子弹并通过反射调用Move()。我称之为kludge,其他人可能会使用不适合Stack Overflow的单词,但以下编译,工作,并不关心T的类型。

ObservableCollection<int> foo = new ObservableCollection<int>()
{
    0, 1, 2, 3, 4
};

var method = foo.GetType()
                .GetMethod("Move", 
                    System.Reflection.BindingFlags.Instance 
                        | System.Reflection.BindingFlags.Public);

//  Not a bad idea to check here if method is null before calling it.

method.Invoke(foo, new object[] { 0, 2 });

你可能想要调用Type.GetMethods()并使用LINQ搜索结果,这样你就可以防止你手上有一个子类的罕见情况,它会使用不同的参数重载Move()

GetMethod()Invoke()来电并不关心究竟是什么类型ObservableCollection。并且您将获得您正在寻找的单个CollectionChanged事件。