【问题标题】:Get type of items in ObservableCollection获取 ObservableCollection 中的项目类型
【发布时间】:2013-02-25 13:14:12
【问题描述】:

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

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&lt;object&gt; 类型的 someCollection,因为如果它的实际类型为 ObservableCollection&lt;ClassFoo&gt;,我将收到编译错误,因为我必须添加对 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&lt;ClassFoo&gt;,我该如何通过反射来做到这一点?


编辑

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

    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

【问题讨论】:

  • Project1可以为类做接口吗?
  • 我认为@SLaks 的想法是最好的解决方案。在 Project1 中创建一个接口并让ClassFoo 实现它(因为 Project2 确实 引用了 Project1)。然后你可以使用那个界面代替object,你就完成了。
  • 我希望大声笑。我只是懒惰。我可以执行一个命令来解决这个问题。我问这个问题主要是为了学习。我只需要创建一个不带参数的ClassFoo 类型的新项目,创建一个命令然后绑定它只是为了做一个简单的操作是没有意义的......懒懒的
  • @SLaks 方法是最好的解决方案,您也可以使用反射动态加载 dll 以避免循环 dll 引用
  • @CuongLe:动态加载 DLL 根本没有帮助。

标签: c# reflection mvvm collections


【解决方案1】:

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

public interface IClassFoo
{
   string Name { get; }
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多