首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用集合再加载器

通用集合再加载器
EN

Stack Overflow用户
提问于 2018-07-23 19:20:49
回答 2查看 126关注 0票数 1

是否可以将特定类型ex:ConcurentBag<T>更改为S类型。我想创建一个泛型类来加载数据和重新加载源集合(list<T>ConcurrentBag<T>,Dictionary)

这是我的密码:

代码语言:javascript
复制
public interface IRepositoryRelouder
{
    private void ReloadData();
}
public interface IRepositoryLoader<out T> : IRepositoryRelouder
{
    IEnumerable<T> LoadData();
}
public abstract class Test<T> : IRepositoryLoader<T>
{
    protected ConcurrentBag<T> Source;
    public abstract IEnumerable<T> LoadData();

    private void void IRepositoryRelouder.Reload() => 
        Source = new ConcurrentBag<T>(LoadData());
}

我希望在父类中加载和重新加载数据,并创建具有访问Source属性的子类。是否允许将ConcurentBag替换为下一个泛型参数?

我想知道这样的事情是否可能:

代码语言:javascript
复制
 public abstract class Test<T,S> : IRepositoryLoader<T>
    {
        protected S <T> Source;
        public abstract IEnumerable<T> LoadData();

        private void void IRepositoryRelouder.Reload() => 
            Source = new S <T>(LoadData());
    }

Where S is ConcurrentBag<T> or List<T>

更新

我想把重装机制分给家长上课。我可以有两种重新加载机制:简单的和复杂的(在重载方法中调用几个方法)。子类可以访问存储库和工厂。有几个insert、create方法可以在子类中从继承的类中对数据源使用linqu。复杂的机制包含额外的字段和方法,所以我不想重复代码。在这种情况下,有什么更好的办法呢?我能用一本也是implementsIEnumerable的字典吗?

IRepositoryRelouder接口只适用于在配置类中实现此接口的ech类的调用Reload方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-23 20:04:53

很不清楚您想从问题中得到什么,但从外观上看,您需要多个可枚举类型,这取决于您使用的是哪个类。

代码语言:javascript
复制
public abstract class Test<T, TEnumerable> : IRepositoryLoader<T>
    Where TEnumerable : IEnumerable<T>
{
    Func<IEnumerable<T>, TEnumerable> _enumerableResolver;
    public Test(Func<IEnumerable<T>, TEnumerable> enumerableResolver)
    {
         this._enumerableResolver = enumerableResolver
    }

    protected TEnumerable Source;
    public abstract IEnumerable<T> LoadData();

    private void IRepositoryRelouder.Reload() => 
        Source = this._enumerableResolver(LoadData());
}

然后,您可以像这样调用实例化:

代码语言:javascript
复制
public class TestA: Test<TestItem, ConcurentBag<TestItem>>
{
   public TestA() : base(x => new ConcurentBag<TestItem>(x))
   {  
   }
}

再说一次,我甚至不明白为什么首先需要第二个参数:当您只需将重载方法变得抽象的时候

代码语言:javascript
复制
protected abstract void Reload();

然后让你的类来实现它。

代码语言:javascript
复制
public class TestA: Test<TestItem>
{
    protected void Reload() => new ConcurentBag<TestItem>(LoadData())
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-23 21:56:41

这是可能的,但有点易碎的设计,因为它依赖于这样一个事实,即ConcurrentBag<T>List<T>都可以将IEnumerable作为构造函数参数并自己填充。如果您需要支持构造函数参数不像这样一致的类型,我将推荐johnny的答案。

无论如何,您只需要像这样的类型约束:

代码语言:javascript
复制
public abstract class Test<TItem,TContainer> : IRepositoryLoader<TItem> 
    where TContainer : class, IEnumerable<TItem>

ReloadData()应该是这样的:

代码语言:javascript
复制
void IRepositoryReloader.ReloadData()
{       
    this.Source = (TContainer)Activator.CreateInstance(typeof(TContainer), new [] { LoadData() } );
}

见我的DotNetFiddle上的完整工作实例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51485847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档