通过反射为给定/动态类型查找ObservableCollection

时间:2014-02-14 14:36:51

标签: c# generics reflection types observablecollection

我有一个Class,它有几个不同类型的ObservableCollections。现在,我想通过反射为给定类型找到正确的Collection,因为我不想构建一个if-monster,每次添加另一个Collection时都必须更新。

这个方法是第一步:

public ObservableCollection<T> GetObservableCollectionForType<T>()
{

   foreach (PropertyInfo info in this.GetType().GetProperties())
   {

      if (info.GetGetMethod() != null && info.PropertyType == typeof(ObservableCollection<T>))
         return (ObservableCollection<T>)this.GetType().GetProperty(info.Name).GetValue(this, null);                   

   }

   return null;

}

现在,我需要第二种方法,它接受一个具体对象作为参数并找到正确的Collection。不知怎的,这样:

public ObservableCollection<T> GetObservableCollectionFor(object sObject)
{

   Type wantedType = sObject.GetType();

   foreach (PropertyInfo info in this.GetType().GetProperties())
   {

     if (info.GetGetMethod() != null && info.PropertyType == ObservableCollection<wantedType>)
        return this.GetType().GetProperty(info.Name).GetValue(this, null);

   }

   return null;

}

任何想法如何实现这一点?

更新

工作解决方案:

public object GetObservableCollectionFor(object sObject)
{

   Type wantedType = sObject.GetType();

   foreach (PropertyInfo info in this.GetType().GetProperties())
   {

      if (info.GetGetMethod() != null && info.PropertyType == typeof(ObservableCollection<>).MakeGenericType(new[]{wantedType}))
         return this.GetType().GetProperty(info.Name).GetValue(this, null);

   }

   return null;

}

这将返回正确的集合作为对象。我仍然不知道如何转换为正确的泛型类型,但是转换为IList就足以添加和删除。

1 个答案:

答案 0 :(得分:2)

在比较属性的类型时,看起来您需要在ObservableCollection类型上添加对MakeGenericType()的调用。 Haven没有对此进行测试,但可能就像......

public ObservableCollection<T> GetObservableCollectionFor(object sObject)
{

   Type wantedType = sObject.GetType();

   foreach (PropertyInfo info in this.GetType().GetProperties())
   {

     if (info.GetGetMethod() != null && info.PropertyType == typeof(ObservableCollection<>).MakeGenericType(new[]{Type.GetType(wantedType)})

        return (ObservableCollection<T>)this.GetType().GetProperty(info.Name).GetValue(this, null);

   }

   return null;

}

修改 为了避免使用值类型进行开销装箱,可以通过将参数类型从对象更改为类型T

来改进上述方法定义
public ObservableCollection<T> GetObservableCollectionFor(T sObject)