使用 ObservableCollection 的反射实例

发布于 2024-11-14 11:57:48 字数 301 浏览 7 评论 0原文

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

Type virtualObservable = typeof(ObservableCollection<>);
object observable = virtualObservable.MakeGenericType(genericType)

我有一个对象,但我不能像 ObservableCollection 一样使用它,这就是我所需要的。

有什么线索吗?

I'm dealing with reflection stuffs, I've got a problem with a reflected instance of ObservableCollection. I mean, if create a new instance of it with:

Type virtualObservable = typeof(ObservableCollection<>);
object observable = virtualObservable.MakeGenericType(genericType)

I've got an object, but I can't use it like a ObservableCollection, that is what I need.

Any clue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

魂ガ小子 2024-11-21 11:57:48

存在三种可能性:

  1. 如果在编译时已知 genericType,则使用该类型将 MakeGenericType 的返回值转换为 ObservableCollection作为通用参数。
  2. 如果您使用的是 .NET 4.0,请将 observable 设置为 dynamic 类型,而不是 object 类型。
  3. observable 转换为您需要的类型,即,如果您想注册 CollectionChanged 事件,请将其转换为 INotifyCollectionChanged。如果您想迭代它,请将其转换为 IEnumerable

我认为你不能使用第一个选项,因为如果可以,整个反射方法就没有必要了。第二种方法使您在开发时得不到 IntelliSense 支持。我认为选项 3 是最好的。

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

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

There are three possibilities:

  1. If genericType is known at compile time, cast the return value of MakeGenericType to an ObservableCollection<T> using that type of as the generic parameter.
  2. If you are on .NET 4.0, make observable of type dynamic, not object.
  3. Cast observable to the type you need, i.e. if you want to register for the CollectionChanged event, cast it to INotifyCollectionChanged. If you want to iterate over it, cast it to IEnumerable.

I think you can't use the first option, because if you could, the whole reflection approach would be unnecessary. The second approach leaves you with no IntelliSense support while developing. I think option 3 is the best one.

Sample for option 3:
If you want to add a new item to the collection, you need to cast it to ICollection and use the non-generic Add method:

ICollection tmp = (ICollection)observable;
tmp.Add(yourObject);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文