2017-03-17 182 views
0

是否可以在不創建列表副本的情況下創建ReadOnlyCollection?由於元素可以被轉換爲它的基類,所以ReadOnlyCollection不應該返回具體類型,而是返回實現的接口。從例如創建ReadOnlyCollection <IDisposable>。列表<FileStream>

編輯1調整代碼表明我需要返回IList以保持API兼容性。

public class Program : IDisposable 
{ 
    List<Program> Programs = new List<Program>(); 

    public IList<IDisposable> Getter 
    { 
     get 
     { 
      var readOnly = new ReadOnlyCollection<IDisposable>(Programs); 
      return readOnly; 
     } 
    } 

    static void Main(string[] args) 
    { 

    } 
    public void Dispose() 
    { 
    } 
} 

這將不會編譯的原因很明顯,但沒有例如

ReadOnlyCollectionCast<Program,IDisposable> 

哪個會投射到吸氣劑中的IDisposable?

有點更多的歷史,我到了那裏。我確實重構了一個班級,它確實擁有List<IDisposable>作爲班級成員。我需要更好地序列化數據容器中的具體類型。將私人字段從List<IDisposable>更改爲List<Program>是沒有問題的,但公共屬性應保持不變,並且仍將返回IList<IDisposable>作爲只讀列表。

回答

1

你可以隨時使用Linq。 programs.Cast<IDisposable>()給你一個IEnumerable<IDisposable>

編輯: 如果你真的需要返回一個IList,但要真正返回一些只讀集合:

return new ReadOnlyCollection<IDisposable>(programs.Cast<IDisposable>().ToList());

+0

新的ReadOnlyCollection (Programs.Cast ());不會編譯,因爲它期望IList 而不是IEnumerable 。因爲IEnumerable已經是不可變的,所以具有某種意義。 –

0

如果您使用的接口無需鑄造List如下所示:

List<IDisposable> programs = new List<IDisposable>(); 
programs.Add(new Program()); 

將其作爲只讀方式返回:

public IEnumerable<IDisposable> GetReadOlnly() 
{ 
    return programs.Skip(0); 
} 

要返回只讀IList

public IList<IDisposable> GetReadOlnly() 
{ 
    return programs.AsReadOnly(); 
} 
+0

不錯的主意,但我需要返回一個IList 在一個公共getter需要保持API compat原因。 –

+0

請參閱編輯。想法仍然是 – CodingYoshi

+0

問題是我沒有一個IDisposable列表,而是一個具體類的列表。那就是問題所在。 –