2013-03-26 36 views
0

我想初始化泛型類型的所有公共屬性。
我已經寫了下面的方法:初始化通用類型中的所有屬性?

public static void EmptyModel<T>(ref T model) where T : new() 
{ 
    foreach (PropertyInfo property in typeof(T).GetProperties()) 
    { 
     Type myType = property.GetType().MakeGenericType(); 
     property.SetValue(Activator.CreateInstance(myType));//Compile error 
    } 
} 

但它有一個編譯錯誤

我該怎麼辦呢?

回答

5

有三個問題在這裏:

  • PropertyInfo.SetValue有兩個參數,一個引用的對象上設置屬性(或null靜態屬性)',並設置它也值。
  • property.GetType()將返回PropertyInfo。要獲取物業本身的類型,您需要改爲使用property.PropertyType
  • 您的代碼不處理屬性類型上沒有無參數構造函數的情況。如果沒有徹底改變你做事的方式,你不能太想象,所以在我的代碼中,如果沒有找到無參數的構造函數,我將初始化屬性爲null

我想你要找的東西是這樣的:

public static T EmptyModel<T>(ref T model) where T : new() 
{ 
    foreach (PropertyInfo property in typeof(T).GetProperties()) 
    { 
     Type myType = property.PropertyType; 
     var constructor = myType.GetConstructor(Type.EmptyTypes); 
     if (constructor != null) 
     { 
      // will initialize to a new copy of property type 
      property.SetValue(model, constructor.Invoke(null)); 
      // or property.SetValue(model, Activator.CreateInstance(myType)); 
     } 
     else 
     { 
      // will initialize to the default value of property type 
      property.SetValue(model, null); 
     } 
    } 
} 
+0

如果財產沒有什麼構造函數。例如:如果property爲String,則發生此異常:'沒有爲此對象定義無參數構造函數。' – 2013-03-26 03:21:04

+1

@Mohammad Activator.CreateInstance只適用於帶無參數構造函數的類型(至少是您調用它的方式)。看到我的更新答案替代。這會使任何字符串屬性初始化爲null。 – 2013-03-26 03:34:01