2013-07-11 2 views
1

내가하려는 것은 attributesproperty에서 다른 것으로 복사하는 것입니다. 여기 지금 내 코드입니다 :런타임에 생성자 매개 변수의 값을 얻는 방법이 있습니까

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); 
      } 
} 

그것은 있지만 매개 변수가 constructorattributes을 위해 일하고있다. 예 : "DataTypeAttribute"에는 constructorsparameter 만 있습니다. 이 때문에 지금은 copy에만 RequiredAttribute 수 있어요 들어

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() 
    { 

    } 
} 

:의 나는이 모델이 있다고 가정 해 봅시다 attributeconstructor

의 현재 값을 얻을 수있는 방법이 있는지

지금 궁금 매개 변수가없는 constructor. 나는 copy DataTypeAttribute 수 없습니다. 그래서 내 예제 모델에서 이것을 value DataType.Text 받고 싶습니다.

누구나 몇 가지 아이디어가 있습니까?

답변

3

구성된 속성을 반환하는 GetCustomAttributes() 대신 GetCustomAttributesData()을 사용하십시오. CustomAttributeData의 콜렉션을 리턴하는데, 여기에는 필요한 것을 정확히 포함합니다. 속성을 생성하는 데 사용 된 생성자, 인수 및 속성의 명명 된 인수에 대한 정보입니다.

+0

참고 : 매개 변수가없는 생성자 만있는 경우 GetCustomAttributeData()는 1을 반환합니다. AttributeData – harry180

+0

@ harry180 반환 할 내용이 정확하지 않습니까? – svick

+0

당신은 왜 매개 변수가없는'constructor'it의 이상한 경우에'AttributeTarget'을 반환해야하는지 설명 할 수 있습니까? 나는 그것이'null' 또는'array'를 비우겠다고 생각했습니다. – harry180