Свойство класса как коллекция - PullRequest
3 голосов
/ 04 октября 2008

Привет,

Мне нужно включить в свой класс свойство, представляющее собой коллекцию объектов System.IO.FileInfo. Я не совсем уверен, как это сделать и как я бы добавил и удалил объекты из экземпляра класса (я бы предположил, как и любой другой коллекции).

Пожалуйста, дайте мне знать, если мне нужно добавить дополнительную информацию.

Спасибо

Обновление: я подхожу к этому неправильно? Я прочитал комментарии, что добавление в коллекцию, которая является свойством, является плохой практикой. Если это правда, что такое хорошая практика? У меня есть куча объектов, которые нужно хранить в коллекции. Коллекция будет добавлена ​​и удалена до того, как будет выполнено окончательное действие. Это правильный подход или я что-то упустил?

Ответы [ 4 ]

1 голос
/ 04 октября 2008
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);
1 голос
/ 04 октября 2008

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);
0 голосов
/ 04 октября 2008

Я просто делаю это либо список, либо словарь. Я покажу оба.

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 (), но не переназначать сам список или словарь.

0 голосов
/ 04 октября 2008

Один простой способ сделать это - создать свойство как таковое (извините за 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. Некоторые люди, вероятно, скажут, что это плохая практика, и что вам никогда не следует выставлять саму коллекцию, а вместо этого перекодировать все необходимые функции в виде отдельных параметров, которые в основном просто вызывают соответствующие функции из вашей частной коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...