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' の変数に対して操作できません。

誰でも私を助けることができますか?

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構造体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 に答える