2011-07-03 48 views
25

可能是一個愚蠢的問題,但我無法找到任何網絡上的解釋。
此代碼無法正常工作的具體原因是什麼?代碼應該將屬性值從Contact(源)複製到新實例化的ContactBO(目標)對象。方法GetProperties與BindingFlags.Public不返回任何東西

public ContactBO(Contact contact) 
{ 
    Object source = contact; 
    Object destination = this; 

    PropertyInfo[] destinationProps = destination.GetType().GetProperties(
     BindingFlags.Public); 
    PropertyInfo[] sourceProps = source.GetType().GetProperties(
     BindingFlags.Public); 

    foreach (PropertyInfo currentProperty in sourceProps) 
    { 
     var propertyToSet = destinationProps.First(
      p => p.Name == currentProperty.Name); 

     if (propertyToSet == null) 
      continue; 

     try 
     { 
      propertyToSet.SetValue(
       destination, 
       currentProperty.GetValue(source, null), 
       null); 
     } 
     catch (Exception ex) 
     { 
      continue; 
     } 
    } 
} 

這兩個類具有相同的屬性名稱(BO類有其他幾個,但它們對初始化無關緊要)。這兩個類只有公共屬性。當我運行上面的示例時,destinationProps 的長度爲零。

但是,當我用BindingFlags.Instance擴大GetProperties方法時,它突然返回所有內容。如果有人能夠澄清這個問題,我會感激,因爲我迷路了。

+1

如果你想檢查''對你null'不應該使用'First',因爲它會拋出一個異常,如果它不能找到它不一個項目propertyToSet'匹配謂詞。改用'FirstOrDefault'。 –

+2

爲了保存那些像我一樣關注屬性和字段之間差異的人,請嘗試GetFields(); whups。 –

回答

37

GetProperties方法的文檔:

您必須獲得 返回指定要麼BindingFlags.Instance或 BindingFlags.Static。

+1

這正是我正在做的。問題的原因是爲什麼BindingFlags.Public不返回公共屬性?好吧,我猜這就是框架的工作原理。 –

22

此行爲是因爲你必須指定的BindingFlags靜態或實例成員。 BindingFlags是一個可以使用|(按位或)組合的標誌枚舉。

你想要的是:

.GetProperties(BindingFlags.Instance | BindingFlags.Public);