簡體   English   中英

類屬性作為集合

[英]Class property as a collection

問候,

我需要在我的類中包含一個屬性,它是System.IO.FileInfo對象的集合。 我不確定如何做到這一點,以及如何從類的實例添加和刪除對象(我會假設像任何其他集合)。

如果我需要添加更多信息,請告訴我。

謝謝

更新:我接近這個錯誤的方式嗎? 我已經閱讀了評論,添加到一個屬性的集合是不好的做法。 如果這是真的,那么什么是好的做法? 我有一堆對象需要存儲在一個集合中。 該集合將在對其進行最終操作之前添加和刪除。 這是正確的方法還是我錯過了什么?

File是一個靜態類。 所以我們假設您的意思是FileInfo

有很多方法,你可以:

  • 揭露私人領域
  • 使用迭代器
  • 通過ReadOnlyCollection <>公開私有字段

例如,

class Foo {
    public IEnumerable<FileInfo> LotsOfFile {
        get {
            for (int i=0; i < 100; i++) {
                yield return new FileInfo("C:\\" + i + ".txt");
            }
        }
    }
    private List<FileInfo> files = new List<FileInfo>();
    public List<FileInfo> MoreFiles {
        get {
            return files;
        }
    }
    public ReadOnlyCollection<FileInfo> MoreFilesReadOnly {
        get {
            return files.AsReadOnly();
        }
    }

}

使用此代碼,您可以輕松添加到屬性MoreFiles

Foo f = new Foo();
f.MoreFiles.Add(new FileInfo("foo.txt"));
f.MoreFiles.Add(new FileInfo("BAR.txt"));
f.MoreFiles.Add(new FileInfo("baz.txt"));
Console.WriteLine(f.MoreFiles.Count);
using System.Collections.ObjectModel;

public class Foo
 { private Collection<FileInfo> files = new Collection<FileInfo>();
   public Collection<FileInfo> Files { get { return files;} }
 }

//...
Foo f = new Foo();
f.Files.Add(file);

一個簡單的方法是創建一個屬性(抱歉VB.Net)

Public ReadOnly Property Files As Generic.List(Of IO.File)
    GET
        Return _Files
    END GET
END Property

其中_Files是Generic.List(Of IO.File)類型的私有類變量,它包含文件列表。 這將允許通過調用List數據類型的函數來添加和刪除文件。 有些人可能會說這是不好的做法,並且你永遠不應該公開集合本身,而是將所有必要的函數重新編碼為單獨的參數,這基本上只需從私有集合中調用相應的函數。

我只是把它作為一個列表或字典。 我會同時展示。

class Example
{
    public List<FileInfo> FileList { get; set; }
    public Dictionary<string, FileInfo> Files { get; set; }

    public Example()
    {
        FileList = new List<FileInfo>();
        Files = new Dictionary<string, FileInfo>();
    }

}

您現在將使用該屬性,就好像它是實際的List或Dictionary對象一樣。

var obj = new Example();
obj.FileList.Add(new FileInfo("file.txt")); // List<>
obj.Files.Add("file.txt", new FileInfo("file.txt")); // Dictionary<>
// also
obj.Files["file2.txt"] = new FileInfo("file2.txt"); // Dictionary<>

// fetch 
var myListedFile = obj.FileList[0]; // List<>
var myFile = obj.Files["file.txt"]; // Dictionary<>

我更喜歡字典方法。

請注意,由於屬性是公共集,因此您也可以替換整個列表或字典。

obj.Files = new Dictionary<string, FileInfo>();
// or
var otherFiles = new Dictionary<string, FileInfo>();
otherFiles["otherfile.txt"] = new FileInfo("otherfile.txt");
obj.Files = otherFiles;

如果您將屬性設置為私有,那么您仍然可以調用Add(),但不能重新分配列表或字典本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM