2 回答
TA贡献1865条经验 获得超7个赞
这是可能的,但有点脆弱的设计,因为它依赖于这样一个事实,ConcurrentBag<T>并且List<T>可以将 IEnumerable 作为构造函数参数并填充自身。如果您需要支持构造函数参数不一致的类型,我建议使用 johnny 的答案。
无论如何,你只需要一个这样的类型约束:
public abstract class Test<TItem,TContainer> : IRepositoryLoader<TItem>
where TContainer : class, IEnumerable<TItem>
而 ReloadData() 看起来像这样:
void IRepositoryReloader.ReloadData()
{
this.Source = (TContainer)Activator.CreateInstance(typeof(TContainer), new [] { LoadData() } );
}
TA贡献1793条经验 获得超6个赞
非常不清楚您想要从问题中得到什么,但从它的外观来看,您需要多种可枚举类型,具体取决于您使用的类。
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());
}
然后你可以像这样调用实例化:
public class TestA: Test<TestItem, ConcurentBag<TestItem>>
{
public TestA() : base(x => new ConcurentBag<TestItem>(x))
{
}
}
然后我什至不明白为什么你首先需要第二个参数:当你可以让你的 reload 方法抽象时
protected abstract void Reload();
然后让你的班级实现它。
public class TestA: Test<TestItem>
{
protected void Reload() => new ConcurentBag<TestItem>(LoadData())
}
- 2 回答
- 0 关注
- 190 浏览
添加回答
举报