2013-07-11 109 views
1

我想要做的是將現有的attributes從一個property複製到另一個。 這裏是我的代碼現在:有沒有辦法在運行時獲得構造函數的參數值

foreach (var prop in typeof(Example).GetProperties()) 
{ 
      FieldBuilder field = typeBuilder.DefineField("_" + prop.Name, prop.PropertyType, FieldAttributes.Private); 

      PropertyBuilder propertyBuilder = 
       typeBuilder.DefineProperty(prop.Name, 
           PropertyAttributes.HasDefault, 
           prop.PropertyType, 
           null); 

      object[] attributes = prop.GetCustomAttributes(true); 
      foreach (var attr in attributes) 
      { 
       //Here I need to get value of constructor parameter passed in declaration of Example class 
       ConstructorInfo attributeConstructorInfo = attr.GetType().GetConstructor(new Type[]{}); 
       CustomAttributeBuilder customAttributeBuilder = new CustomAttributeBuilder(attributeConstructorInfo,new Type[]{}); 
       propertyBuilder.SetCustomAttribute(customAttributeBuilder); 
      } 
} 

它的工作,但僅適用於attributes具有參constructor。 例如「DataTypeAttribute」只有constructorsparameter

現在我想知道如果有一種方式來獲得的attributeconstructor

電流值比方說,我有這樣的模式:

public class Example 
{ 
    public virtual int Id { get; set; } 
    [Required] 
    [MaxLength(50)] 
    [DataType(DataType.Text)] 
    public virtual string Name { get; set; } 
    [MaxLength(500)] 
    public virtual string Desc { get; set; } 
    public virtual string StartDt { get; set; } 

    public Example() 
    { 

    } 
} 

現在我能夠copyRequiredAttribute因爲它有無參數constructor。我無法copyDataTypeAttribute。所以我想從我的示例模型中獲得這個valueDataType.Text

任何人有一些想法如何使它工作?

回答

3

而不是GetCustomAttributes(),它返回構造屬性,使用GetCustomAttributesData()。它返回一個CustomAttributeData的集合,它正是您所需要的:用於創建屬性的構造函數,其參數以及有關該屬性的命名參數的信息。

+0

注意:當只有無參數的構造函數時GetCustomAttributeData()返回1 AttributeData – harry180

+0

@ harry180這不正是它應該返回的內容嗎? – svick

+0

你能解釋爲什麼它應該'返回''AttributeTarget'無參數'構造函數'對我來說很奇怪。我認爲它會'返回'null'或者空數組'。 – harry180

相關問題