2012-09-08 46 views
3

我這樣定義一個屬性:使用的foreach在C#中的屬性

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語句canno t對'PEfileReader.PeHeaderReader.IMAGE_DOS_HEADER'類型的變量進行操作,因爲'PEfileReader.PeHeaderReader.IMAGE_DOS_HEADER'不包含'GetEnumerator'的公共定義

任何人都可以幫助我?

+1

什麼是結構枚舉?它看起來像只有一個,而不是它們的數組。 – GolezTrol

+0

創建通用列表列表 idh = new List ();.然後,您可以添加像idh.Add(新ImageDoesHeader {e_magic = 1,e_cblp = 2,e_cp = 3,e_crlc = 4,e_cparhdr = 5,e_minalloc = 6});。現在你可以使用foreach循環遍歷集合。 – 2012-09-08 09:11:55

回答

1

嘗試用您的struct IMAGE_DOS_HEADER實現IEnumerable

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(); 

然後,你可以插入值到ListView

foreach (var item in fieldsAndValues) 
{ 
    listView2.Items[i].SubItems.Add(item.Value); 
} 
+1

我開始覺得我們都做出了錯誤的假設; OP似乎並沒有試圖枚舉這些字段? – Adam

+0

謝謝你這是一個很好的答案,但我仍然不能把這些項目放在列表視圖 – user1510265

+1

@ user1510265,你不能把這些名稱/值對的列表視圖與您的問題沒有關係。我不知道你使用什麼(ASP.Net,Winforms,WPF等)以及你如何使用。 –

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(); 
     } 
    }