类属性作为集合

3

问候,

我需要在我的类中包含一个属性,该属性是 System.IO.FileInfo 对象的集合。我不太确定如何实现这一点,并且我也不知道如何向类的实例添加和删除对象(我认为应该像任何其他集合一样)。

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

谢谢

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

4个回答

1

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

谢谢,但您错过了我的问题的一部分,我需要向集合中添加内容,但是当它是只读时不可能实现。 - Brettski

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

0

一个简单的方法是创建这样的属性(对于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 数据类型的函数来添加和删除文件。有些人可能会说这是不好的做法,你不应该直接暴露集合本身,而是应该将所有必要的函数重新编码为单独的参数,这些参数基本上只是从你的私有集合中调用相应的函数。


这基本上是实现它的方法:将集合公开为只读属性。然而,微软指南建议将其公开为IList<T>而不是List<T>。 - Joe

0

我可以将它转换成列表或字典。我会展示两种方式。

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

}

现在,您可以像使用实际的列表或字典对象一样使用该属性。

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;

如果你将属性设置为 private set,那么你仍然可以调用 Add() 方法,但不能重新分配列表或字典本身。

将集合属性设置为可设置的被认为是不好的编程实践。 - Joe
Joe,那么在你的类的属性中添加集合的“正确”方法是什么?我有所有这些项,需要添加或删除它们...你有什么建议? - Brettski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接