亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通用集合重載器

通用集合重載器

C#
MMTTMM 2021-10-24 16:44:07
是否有可能改變特定類型Ex:ConcurentBag<T>對S輸入。我想使通用類加載數據和重裝源集合(list<T>,ConcurrentBag<T>,字典)這是我的代碼: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 替換為下一個通用參數是否可行?我想知道是否有可能是這樣的: 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。復雜的機制包含額外的字段和方法,所以我不想重復代碼。在這種情況下怎么做會更好?我可以使用也實現 IEnumerable 的字典嗎?IRepositoryRelouder 接口僅用于在配置類中實現該接口的 ech 類調用 Reload 方法。
查看完整描述

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

}


查看完整回答
反對 回復 2021-10-24
?
搖曳的薔薇

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())

}


查看完整回答
反對 回復 2021-10-24
  • 2 回答
  • 0 關注
  • 235 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號