2011-06-09 56 views
1

我正在使用一個名爲filehelpers的工具,它定義了一個用於文件導入的動態類。類文件可能如下所示:c#反映屬性或其他成員類型

[DelimitedRecord(",")] 
[IgnoreFirst(1)] 
public class TestNoPrimaryKey 
{ 

[FieldConverter(ConverterKind.Decimal, ".")] 
[FieldQuoted()] 
public decimal Value; 

[FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)] 
public String aString; 

} 

這是從我能看到的代碼中正確創建的。接下來,我需要以可比較的格式創建一個數據表,所以我可以做一個SQL插入。通過對實物幫助,所以我有這樣的代碼,它接受的類型(如上定義)和意圖產生的輸入數據表列對我來說:

public static DataTable TypeToEmptyDataTable(Type myType) 
{ 
    DataTable dt = new DataTable(); 

    foreach (PropertyInfo info in myType.GetProperties()) 
    { 
     dt.Columns.Add(new DataColumn(info.Name, info.PropertyType)); 
    } 

    return dt; 
} 

不幸的是,它沒有找到任何屬性,並返回沒有列的DataTable 。現在我在想 - 如果得到;組;等等在課堂上沒有指定,可能它們本身不是'屬性'。也許getMembers是我需要的?我試過,但返回info.MemberType沒有工作。

有關如何從我的課程中獲取名稱/類型的任何想法?我不相信我可以添加get/set,因爲我使用的文件保護工具需要該類佈局。

謝謝!

回答

6

您還沒有在上面的代碼中寫入任何屬性 - 您已聲明字段getset確實有非常顯着的區別:)

如果你想獲得領域,只需使用GetFields - 但我建議你讓他們的屬性來代替。屬性在綁定等方面效果更好,並且通常是更好的封裝的開始

+0

完美,非常感謝Jon。如果我通常使用這個類,我肯定會使用屬性,但是由於它在這種情況下的目的幾乎是一個文件定義,所以getfields聽起來很棒。乾杯 – Glinkot 2011-06-09 13:11:05

2

這除了@喬恩飛碟雙向的答案...........

你的領域

讀值是這樣的:的

現在你正在閱讀的屬性沒有的Fileds班

Type type = typeof(ReflectionTest); // Get type pointer 
FieldInfo[] fields = type.GetFields(); // Obtain all fields 
foreach (var field in fields) // Loop through fields 
{ 
     ///you code 
} 
0

使用Get場綁定標誌

myType.GetFields(System.Reflection.BindingFlags.Public | 
      System.Reflection.BindingFlags.Static | 
      System.Reflection.BindingFlags.Instance | 
      System.Reflection.BindingFlags.FlattenHierarchy | 
      System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.GetProperty); 
+0

我沒有看過這些,但會檢查出來。謝謝 :) – Glinkot 2011-06-09 13:12:16