2011-09-12 36 views
1

對象的構造函數我POCO對象MyObject來如何實例的屬性與反思

public class MyModel 
{ 
    public MyProperty MyProperty001 { get; set; } 
    public MyProperty MyProperty002 { get; set; } 


    MyModel() 
    { 
     // New up all the public properties 
     var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (var propertyInfo in properties) 
     { 
      //Activator.CreateInstance() 
     } 
    } 
} 

有數以百計的屬性,使用反射在構造函數中實例化這些是這可能嗎?我有PropertyInfo,但不知道下一步是什麼。

謝謝 斯蒂芬

+0

創建對象,而不是性能的實例。 – Oded

+0

「新」是什麼意思? – Peter

+0

他的意思是實例化 – msarchet

回答

2

物業類型保存在PropertyType屬性PropertyInfo對象,所以根據你可以通過調用Activator.CreateInstance(propertyInfo.PropertyType)實例化你的對象。比你需要通過調用propertyInfo.SetValue(this, instance, null)

全樣本設置實例到你的容器對象的屬性:

foreach (var propertyInfo in properties) 
{ 
    var instance = Activator.CreateInstance(propertyInfo.PropertyType); 
    propertyInfo.SetValue(this, instance, null); 
} 
+0

正是我正在尋找的,謝謝。 –

0
public class MyModel 
{ 
    private MyProperty _MyProperty001 = new MyProperty(); 
    public MyProperty MyProperty001 
    { 
     get { return _myProperty001; } 
     set { _MyProperty001 = value; } 
    } 
} 

使用支持字段,沒有必要進行反思。

+0

這個答案有什麼問題,沒有必要通過反思來做到這一點。 – msarchet

0

假設你要設置的屬性值的根據財產類型的新實例,這應該是可能的方式如下:

var instance = propertyInfo.PropertyType.GetConstructor(Type.EmptyTypes).Invoke(new object[0]); 
propertyInfo.SetValue(this, instance, null); 
+0

只要有該類型的默認構造函數 –

0

如果他們不帶參數的構造函數,你可以做

foreach (var propertyInfo in properties) { 
    ConstructorInfo ci = propertyInfo.GetType().GetConstructor(new Type[] { propertyInfo.PropertyType() }); 
    propertyInfo.SetValue(this, ci.Invoke(new object[] { }), null); 
} 
+0

如果屬性不是索引器,則propertyInfo.SetValue的第三個參數應該爲空 – hazzik

+0

謝謝,將會更新。 – Josh

+0

不確定是否'propertyInfo.GetType()'返回正確的類型。通常它應該只返回'PropertyInfo'。 'propertyInfo.PropertyType'是正確的路要走。 – Peter