2011-09-01 69 views
1

Foo是一個有很多字符串字段的類。我想創建一個方法Wizardify,對對象的許多字段執行操作。我可以這樣做:迭代C中的對象字段#

Foo Wizardify(Foo input) 
{ 
    Foo result; 
    result.field1 = Bar(input.field1); 
    result.field2 = Bar(input.field2); 
    result.field3 = Bar(input.field3); 
    ... 

這是一些容易生成的代碼,但我寧願不浪費五十行。有沒有辦法查看對象的選定字段?請注意,我希望以不同的方式處理四個或五個字段,並且應該從迭代中排除它們。

+1

Bar是一種重載方法嗎? – Ani

+0

@Ani:它的所有字段都是字符串。 –

回答

0

這是關於「優雅」,因爲它得到。您可能可以使用for-loop,但正如您所說的,「我想以不同的方式處理四個或五個字段」。記住KISS原則。

0

通過typeof(YourType).GetProperties()循環並呼叫GetValueSetValue

請注意,反射速度很慢。

5

嘗試

foreach (FieldInfo FI in input.GetType().GetFields()) 
{ 
    FI.GetValue (input) 
    FI.SetValue (input, someValue) 
} 

雖然我不會推薦的反射方式對已知類型的 - 它是緩慢的,並根據您的具體情況可能會造成在運行時的一些權限問題...

+1

,你可以用一些屬性裝飾你的領域,然後使用FI.Attributes;更多這裏:http://stackoverflow.com/questions/156304/c-attributes-on-fields – bkdc

+1

我也不會建議使用反射這一點。這會很慢。您將要編寫的代碼量不會很大,從維護的角度來看它會更清晰。另外,你將在以後避免意想不到的後果。 –

+0

'+ 1'感謝分享!今天保存我的屁股:) – Anne

0

你可以使用動態語言運行時生成類型爲Func的lambda。您只需要生成一次lambda(可以將其緩存),並且不會有反射性能下降。

0

這是我 - 它給了我在我的課的所有屬性的列表(名稱),到後來我可以反射或「表達式樹」工作:

private static string xPrev = ""; 
     private static List<string> result; 

     private static List<string> GetContentPropertiesInternal(Type t) 
     { 
      System.Reflection.PropertyInfo[] pi = t.GetProperties(); 

      foreach (System.Reflection.PropertyInfo p in pi) 
      { 
       string propertyName = string.Join(".", new string[] { xPrev, p.Name }); 

       if (!propertyName.Contains("Parent")) 
       { 
        Type propertyType = p.PropertyType; 

        if (!propertyType.ToString().StartsWith("MyCms")) 
        { 
         result.Add(string.Join(".", new string[] { xPrev, p.Name }).TrimStart(new char[] { '.' })); 
        } 
        else 
        { 
         xPrev = string.Join(".", new string[] { xPrev, p.Name }); 
         GetContentPropertiesInternal(propertyType); 
        } 
       } 
      } 

      xPrev = ""; 

      return result; 
     } 

     public static List<string> GetContentProperties(object o) 
     { 
      result = new List<string>(); 
      xPrev = ""; 

      result = GetContentPropertiesInternal(o.GetType()); 

      return result; 
     } 

用法:List<string> myProperties = GetContentProperties(myObject);