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 關注
- 235 瀏覽
添加回答
舉報