通用集合的组合

时间:2013-11-17 00:10:29

标签: c# generics

我有几个

的实例
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();
    }
}

1 个答案:

答案 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;我在这里假设来自班级名称。