我有几个
的实例abstract class Repository<T> where T : ViewModelBase
{
public ObservableCollection<T> Get<T>(){...};
}
每个ViewModelBase
的不同实例
如何将所有这些组合成一个班级GlobalRepository
使用一个方法,它将从包含Repository的实例返回指定的集合?
class GlobalRepository
{
//... List of Repository<ViewModelBase>
public ObservableCollection<T> Get<T>()
{
return (Containing instance of Repository<T>).Get();
}
}
答案 0 :(得分:0)
不需要Get方法之后的<T>
约束,因为您在抽象类定义中有它。你在两个地方都不需要它,所以可以跳过其中一个。
此外,如果您将Repository<T>
设为静态,则不需要任何GlobalRepository
。
调用适当的数据可能如下所示:
var data = Repository<T>.Get();
注意:如果您在静态类标题中使用泛型,则此方法有效。不确定,如果用Get方法绑定它时它的工作方式是否相同,但我确定有解决方法。
但是,如果您仍然坚持GlobalRepository
课程,那么您可能应该为该课程设置一个类似Dictionary<Type, Repository<ViewModelBase>>
的字段,其中Type
将是您要求的实际类型。您的Global类方法不需要是通用的:
class GlobalRepository
{
private Dictionary<Type, Repository<ViewModelBase>> _repoDict;
public GlobalRepository()
{
_repoDict = new Dictionary<Type, Repository<ViewModelBase>>();
//Guess here could be some Assembly lookup for all derived classes
//But if you do not intend to expand them a lot, it can be hardcoded
Repository<ViewModelBaseType> repo = new Repository<ViewModelBaseType>()
_repoDict.Add(ViewModelBaseType, repo);
//the similar for all of the repositories
}
public ObservableCollection<ViewModelBase> Get(Type t)
{
if(!_repoDict.ContainsKey(typeof(t)){
//throw your argument exception here
}
Repository<ViewModelBase> repo;
_repoDict.TryGetValue(t, repo);
ObservableCollection<t> collection = repo.Get();
return collection;
}
}
注意:这肯定是不生产就绪代码
可能需要一些转换,但我认为你仍然可以尝试静态,除非你真的需要创建每个Repository的更多实例 - &gt;我在这里假设来自班级名称。