获取ObservableCollection中的项类型

时间:2013-02-01 03:44:24

标签: c# reflection mvvm collections

我有一个绑定到某个可观察集合的视图(由listview组成)。换句话说,我有:

var someCollection = new ObservableCollection<ClassFoo>();
// initialize someCollection

ListView someView = new ListView();
someView.DataContext = someCollection;
someView.ItemsSource = someCollection;

注意:

  • someView位于 Project1.dll 上,someCollection位于 Project2.dll
  • Project2.dll 引用了 Project1.dll Project1.dll 没有对 Project2.dll的引用

因此,在我看来,我有一个类型ObservableCollection<object>的someCollection的引用,因为如果它的实际类型为ObservableCollection<ClassFoo>,我将得到一个编译错误,因为我必须添加一个引用Project2.dll。

出于某种原因,我无法添加该引用,而我的老板要我创建命令等...


最后一部分只是解释了为什么我要这样做,但总之我正在寻找:

  ObservableCollection<object> myUnknownObservableCollection = someReference;
  // I know that someReferce is of type ObservableCollection<ClassFoo>
  var x = myUnknownObservableCollection.GetType().GetTypeOfItems.....

最后我希望x等于typeof(ClassFoo)如果someReference的类型为ObservableCollection<ClassFoo>,我怎么能用反射做呢?


修改

我有一个解决方案!这是:

    class Person 
    {
        public string Name { get { return "Antonio"; } }
    }

    .. 

    // view code:

    IEnumerable<object> uncknownObject;

    // view model does this:
    uncknownObject = new ObservableCollection<Person>( );

    // continuation of view code:

    var observCol = uncknownObject.GetType( );

    var x = ( ( dynamic )observCol ).GenericTypeArguments[ 0 ]; 

    var instance = ( Person )Activator.CreateInstance( x );

    Console.WriteLine( instance.Name ); // Print Antonio!!!

能够在没有动态数据类型的情况下做到这一点很好


编辑2

Here is a solution running .net 4.0 without using the dynamic type

1 个答案:

答案 0 :(得分:0)

如果您打算使用mvvm,那么动态类型将无助于绑定。 您可能必须使用SLaks建议的界面

public interface IClassFoo
{
   string Name { get; }
}

public class ClassFoo : IClassFoo
{
    public string Name { get { return "Antonio"; } }
}

//Usage 
var someCollection = new ObservableCollection<IClassFoo>();