2008-10-04 2 views
3

Привет,Класс имущества в виде коллекции

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

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

Спасибо

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

ответ

1

File - статический класс. Итак, давайте предположим, что вы имели в виду FileInfo.

Есть много способов, вы можете:

  • Expose закрытого поля
  • Используйте итераторы
  • Expose закрытого поля через 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

Спасибо, но вы пропустили одну часть моего вопроса, мне нужно ДОБАВИТЬ в коллекцию, что невозможно, если она только для чтения. – Brettski 2008-10-04 02:20:51

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

+0

Это по существу способ сделать это: выставить коллекцию как свойство readonly. Однако в Руководстве MS говорится, что он должен быть представлен как IList , а не List . – Joe 2008-10-04 09:40:11

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

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

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

Это считается плохой практикой для свойств, которые собираются для сбора. – Joe 2008-10-04 09:38:51

Смежные вопросы