C# 注册到ObservableCollection<;AnyType>;。CollectionChanged而不知道泛型类型?
我有一个“基本”类,我想在其中观察所做的任何更改 对于所有属性,我都要经过C# 注册到ObservableCollection<;AnyType>;。CollectionChanged而不知道泛型类型?,c#,.net,generics,reflection,C#,.net,Generics,Reflection,我有一个“基本”类,我想在其中观察所做的任何更改 对于所有属性,我都要经过GetValue()和SetValue()。然后,我有一个备份字段的字典,以CallerMemberName作为键存储 在执行SetValue()时,我希望如果T是observedcollection,则注册到CollectionChanged事件(或取消注册以前的值) 你知道我怎样才能做到这一点吗 public void RegisterIfObservable<T>(T value){ Type t
GetValue()
和SetValue()
。然后,我有一个备份字段的字典
,以CallerMemberName
作为键存储
在执行SetValue()
时,我希望如果T
是observedcollection
,则注册到CollectionChanged
事件(或取消注册以前的值)
你知道我怎样才能做到这一点吗
public void RegisterIfObservable<T>(T value){
Type type = typeof(T);
if(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObservableCollection<>)){
//TODO Register
}
}
public void RegisterIfObservable(T值){
类型=类型(T);
if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(ObservableCollection)){
//待办事项登记簿
}
}
目标是在每次插入/删除时创建一个对象
new UndoableListAddAction<TU>(ObservableCollection<TU> collection, TU addedElement)
新的UndoableListAddAction(ObservableCollection集合,TU AddElement)
可通过接口获得CollectionChanged
事件,该接口由ObservableCollection
实现。您只需使用它,就可以摆脱类型的所有检查。您可以有一个helper方法public void RegisterObservable(IObservable value){}
,您称之为反射:
public void RegisterIfObservable<T>(T value){
Type type = value.GetType();
// I don't think you can simply use typeof(T) instead of value.GetType() here
// if the compiler does not know for certain at compile time
// whether T will be an IObservable.
// And if you DO know that at compile time, then use the alternative solution below.
if(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObservableCollection<>))
{
Type genericArgument = type.GetGenericArguments()[0];
MethodInfo method = this.GetType().GetMethod("RegisterObservable");
// instead of this.GetType() you could use the type
// of a helper class where RegisterObservable is located
MethodInfo genericMethod = method.MakeGenericMethod(genericArgument);
genericMethod.Invoke(this, new object[]{value});
}
}
public class HelperClass<TU>
{
public void RegisterIfObservable<T>(T value) where T: ICollection<TU>
{
var obs = value as ObservableCollection<T>;
if (obs!=null)
{
...
}
}
}
在这种情况下,T
是什么?@PatrickHofman T是可观察的集合(可能是,但没有通用约束),这很好,我不知道!我唯一的问题是,在EventHandler中,我必须创建一个泛型类的实例。我还需要在事件处理程序中使用ObservableCollection
(至少是IList
),您确定不能只使用普通的对象和非类型接口,如ICollection
(否
)哪个observateCollection
也实现?所有这些反射代码都很难读取,而且您在某种程度上正在失去类型安全性。在这个对象中,我需要执行相反的操作(如果是删除,我需要能够调用Add,如果是添加,我需要执行删除)。所以我觉得我需要这种类型,但如果你有其他想法,我是开放的?例如,有Add和Remove。另一个类型安全性稍高的解决方案是创建一个泛型方法来完成所有工作,安全地键入,然后使用泛型调用该方法。我喜欢你的方法,不幸的是,我只知道T
而不知道TU
。目前我正在尝试一种基于动态用法的解决方案