3

我定义了一个这样的属性:

public IMAGE_DOS_HEADER  ImageDosHeader 
        {

            get
            {
                return imageDosHeader; 
            }
        }

其中 IMAGE_DOS_HEADER 是这样的结构

public struct IMAGE_DOS_HEADER
        {      // DOS .EXE header
            public UInt16 e_magic;              // Magic number
            public UInt16 e_cblp;               // Bytes on last page of file
            public UInt16 e_cp;                 // Pages in file
            public UInt16 e_crlc;               // Relocations
            public UInt16 e_cparhdr;            // Size of header in paragraphs
            public UInt16 e_minalloc;           // Minimum extra paragraphs needed
         }

最后我想在主程序中使用这个属性,像这样使用 foreach

foreach (var DosHeader in reader.ImageDosHeader)
       {
           listView2.Items[i].SubItems.Add(DosHeader.ToString("X"));
           i++;
       }

但发生编译错误:“错误 1 ​​foreach 语句无法对 'PEfileReader.PeHeaderReader.IMAGE_DOS_HEADER' 类型的变量进行操作,因为 'PEfileReader.PeHeaderReader.IMAGE_DOS_HEADER' 不包含 'GetEnumerator' 的公共定义”

有人可以帮助我吗?

4

3 回答 3

2

要获取结构的字段,您应该使用反射

IMAGE_DOS_HEADER header = new IMAGE_DOS_HEADER() { e_cblp = 1, e_cp = 2, e_cparhdr = 3, e_crlc = 4, e_magic = 5, e_minalloc = 6 };

var fieldsAndValues = 
        typeof(IMAGE_DOS_HEADER)
        .GetFields()
        .Select(f=>new {
            Name= f.Name,  //<== Name of the field
            Value = f.GetValue(header) //<==Value of the field
        })
        .ToList();

然后您可以将值插入列表视图

foreach (var item in fieldsAndValues)
{
    listView2.Items[i].SubItems.Add(item.Value);
}
于 2012-09-08T08:59:56.447 回答
1

尝试IEnumerable使用您的 struct IMAGE_DOS_HEADER 实现。

于 2012-09-08T08:56:27.307 回答
1

将您的 IMAGE_DOS_HEADER 结构修改为以下内容:

 public struct IMAGE_DOS_HEADER : IEnumerable<UInt16>
    {      // DOS .EXE header
        public UInt16 e_magic;              // Magic number
        public UInt16 e_cblp;               // Bytes on last page of file
        public UInt16 e_cp;                 // Pages in file
        public UInt16 e_crlc;               // Relocations
        public UInt16 e_cparhdr;            // Size of header in paragraphs
        public UInt16 e_minalloc;           // Minimum extra paragraphs needed


        public IEnumerator<UInt16> GetEnumerator()
        {
            return (IEnumerator<UInt16>)(new[] {e_magic, e_cblp, e_cp, e_crlc, e_cparhdr, e_minalloc}.GetEnumerator());
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return new[] { e_magic, e_cblp, e_cp, e_crlc, e_cparhdr, e_minalloc }.GetEnumerator();
        }
    }
于 2012-09-08T09:04:04.787 回答