1

您好我正在尝试使用复合模式创建目录结构。我有一个由文件和文件夹类实现的接口 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);
    }
}
4

2 回答 2

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; }
    }
}
于 2013-07-20T02:43:40.733 回答
0

假设您想对目录中文件的大小求和,那么您的循环次数太多了。这样就可以了...

public double GetAssetSize()


  {
        foreach (var asset in list)
        {
            _size += x.GetAssetSize();
        }
        return _size;
    }
于 2013-07-20T02:45:13.783 回答