Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ObservableCollection的反射实例_C#_.net_Reflection_Runtime_Activator - Fatal编程技术网

C# 使用ObservableCollection的反射实例

C# 使用ObservableCollection的反射实例,c#,.net,reflection,runtime,activator,C#,.net,Reflection,Runtime,Activator,我在处理反射的东西,我遇到了一个关于ObservaleCollection的反射实例的问题。我的意思是,如果创建一个新的实例: Type virtualObservable = typeof(ObservableCollection<>); object observable = virtualObservable.MakeGenericType(genericType) Type virtualObservable=typeof(observeCollection); objec

我在处理反射的东西,我遇到了一个关于ObservaleCollection的反射实例的问题。我的意思是,如果创建一个新的实例:

Type virtualObservable = typeof(ObservableCollection<>);
object observable = virtualObservable.MakeGenericType(genericType)
Type virtualObservable=typeof(observeCollection);
object observable=VirtualLobservable.MakeGenericType(genericType)
我有一个对象,但我不能像一个可观察的集合那样使用它,这就是我需要的


有线索吗?

有三种可能:

  • 如果编译时已知
    genericType
    ,则使用该类型的作为泛型参数,将
    MakeGenericType
    的返回值强制转换为
    observeCollection
  • 如果您使用的是.NET 4.0,请将类型设置为可观察的
    动态
    ,而不是
    对象
  • observable
    强制转换为所需的类型,即,如果要注册
    CollectionChanged
    事件,请将其强制转换为
    INotifyCollectionChanged
    。如果要对其进行迭代,请将其强制转换为
    IEnumerable
  • 我认为您不能使用第一个选项,因为如果可以,整个反射方法将是不必要的。第二种方法在开发时没有IntelliSense支持。我认为方案3是最好的

    选项3的示例:
    如果要向集合中添加新项目,需要将其强制转换为
    ICollection
    ,并使用非通用的
    add
    方法:

    ICollection tmp = (ICollection)observable;
    tmp.Add(yourObject);
    

    是的,我不想在编译时知道类型。动态似乎很有趣,但我更感兴趣的是转换到接口。如果我想使用标准的add()方法向集合中添加元素,该怎么办?