类属性作为集合

本文关键字:集合 属性 | 更新日期: 2023-09-27 17:47:21

问候,

我需要在我的类中包含一个属性,它是System.IO.FileInfo对象的集合。 我不太确定如何执行此操作以及如何在类的实例中添加和删除对象(我会像任何其他集合一样假设)。

如果我需要添加更多信息,请告诉我。

谢谢

更新:我的做法是错误的吗?我读过评论说,添加到作为属性的集合是不好的做法。 如果这是真的,什么是良好做法? 我需要将一堆对象存储在集合中。 在对集合执行最终操作之前,将添加和删除集合。 这是一种正确的方法还是我错过了什么?

类属性作为集合

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);
File是一个

静态类。所以让我们假设你的意思是FileInfo.

有很多方法,你可以:

  • 公开私有字段
  • 使用迭代器
  • 通过只读集合公开私有字段<>

例如

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

执行此操作的一种简单方法是创建一个这样的属性(对不起,VB.Net)

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

其中_Files是 Generic.List(of IO.文件),其中包含文件列表。这将允许通过调用 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(),但不能重新分配列表或字典本身。

相关文章: