2013-07-20 38 views
1

嗨我想創建一個使用複合模式的目錄結構。我有一個由文件和文件夾類實現的IAsset接口。所以兩者都是資產。現在我想遍歷所有文件夾中的所有文件,但我收到錯誤消息:C#複合模式:Program.IAsset不可枚舉

Program.IAsset是不可枚舉

此錯誤消息是在getassetSize內foreach循環()方法。

公共類節目 { 公共接口IAsset { 雙GetAssetSize(); void AddAsset(IAsset a); }

public class File : IAsset 
{ 
    public double Size { get; set; } 
    public double GetAssetSize() 
    { 
     return Size; 
    } 

    public void AddAsset(IAsset a) 
    { 
     Console.WriteLine("No asset can be added to a file"); 

    } 
} 

public class Folder : IAsset 
{ 
    public double Size { get { return _size; } set { _size = value; } } 

    private double _size = 0; 

    public List<IAsset> list = new List<IAsset>(); 

    public double GetAssetSize() 
    { 
     foreach (var asset in list) 
     { 
      foreach (var x in asset) 
      { 
      // _size = x.GetAssetSize(); 
      } 

     } 
     return _size; 
    } 

    public void AddAsset(IAsset a) 
    { 
     list.Add(a); 
    } 
} 

回答

0

裝配到複合圖案IAsset需要繼承IEnumerable<IAsset>或提供一種實現它的部件。例如:

public interface IAsset : IEnumerable<IAsset> 
{ 
    double GetAssetSize(); 
    void AddAsset(IAsset a); 
} 

public class File : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> GetEnumerator() 
    { 
     return new IAsset[0].GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

public class Folder : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> GetEnumerator() 
    { 
     return this.list.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 

或者這樣:

public interface IAsset 
{ 
    double GetAssetSize(); 
    void AddAsset(IAsset a); 
    IEnumerable<IAsset> Assets { get; } 
} 

public class File : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> Assets 
    { 
     get { return new IAsset[0]; } 
    } 
} 

public class Folder : IAsset 
{ 
    ... 
    public IEnumerator<IAsset> GetEnumerator() 
    { 
     get { return this.list; } 
    } 
} 
+0

非常感謝你 – armulator

0

假設你要總結在目錄中的文件的大小,你有一個太多的循環下去。這將做到這一點...

public double GetAssetSize() 


    { 
     foreach (var asset in list) 
     { 
      _size += x.GetAssetSize(); 
     } 
     return _size; 
    } 
+0

謝謝你..讚賞 – armulator