2015-05-20 2 views
0

Пожалуйста, помогите мне, добавляя в DisplayAttribute для Собствености Я попытался, но получает ошибку consturtor утратившегоДобавить DisplayAttribute через TypeBuilder

  var fieldName = string.Format("Prop{0}", fieldName); 
      FieldBuilder fieldBuilder = segmentBuilder.DefineField(fieldName, typeof(string), FieldAttributes.Private); 
      PropertyBuilder propertyBuilder = segmentBuilder.DefineProperty(fieldName, PropertyAttributes.HasDefault, typeof(string), null); 
      MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; 

      MethodBuilder getPropertyMethodBuilder = segmentBuilder.DefineMethod("get_" + fieldName, getSetAttr, typeof(string), Type.EmptyTypes); 
      ILGenerator ilSetGenerator = getPropertyMethodBuilder.GetILGenerator(); 
      ilSetGenerator.Emit(OpCodes.Ldarg_0); 
      ilSetGenerator.Emit(OpCodes.Ldfld, fieldBuilder); 
      ilSetGenerator.Emit(OpCodes.Ret);     

      MethodBuilder setPropertyMethodBuilder = segmentBuilder.DefineMethod("set_" + fieldName, getSetAttr, null, new Type[] { typeof(string) }); 
      ILGenerator ilGetGenerator = setPropertyMethodBuilder.GetILGenerator(); 
      ilGetGenerator.Emit(OpCodes.Ldarg_0); 
      ilGetGenerator.Emit(OpCodes.Ldarg_1); 
      ilGetGenerator.Emit(OpCodes.Stfld, fieldBuilder); 
      ilGetGenerator.Emit(OpCodes.Ret); 

      propertyBuilder.SetGetMethod(getPropertyMethodBuilder); 
      propertyBuilder.SetSetMethod(setPropertyMethodBuilder); 

На самом деле я ожидал класс как ниже с атрибутами на имуществе

public class ModelClass 
{ 
    [Display(Name = "Propery Name A")] 
    public string ProperyA { get; set; } 

    [Display(Name = "Propery Name B")] 
    public string ProperyB { get; set; } 
} 

ответ

4

Используйте CustomAttributeBuilder для создания вашего атрибута и метода SetCustomAttribute, чтобы применить его к свойствам:

Type[] constructorParameters = new Type[] { typeof(string)}; 
ConstructorInfo constructorInfo = typeof(DisplayNameAttribute).GetConstructor(constructorParameters); 
CustomAttributeBuilder displayNameAttributeBuilder = new CustomAttributeBuilder(constructorInfo, new object[] { "Property Name A"}); 

propertyBuilder .SetCustomAttribute(displayNameAttributeBuilder); 

, если вы хотите установить другие свойства атрибутов, вам необходимо установить свойства и значение, используя другой конструктор CustomAttributeBuilder:

Type[] constructorParameters = new Type[0]; 
ConstructorInfo constructorInfo = typeof(DisplayAttribute).GetConstructor(constructorParameters); 

PropertyInfo nameProperty = typeof (DisplayAttribute).GetProperty("Name"); 
PropertyInfo orderProperty = typeof (DisplayAttribute).GetProperty("Order"); 

CustomAttributeBuilder displayAttributeBuilder = new CustomAttributeBuilder(constructorInfo, new object[] { }, new PropertyInfo[]{ nameProperty, orderProperty}, new object[]{"Prop Name", 1}); 

custNamePropBldr.SetCustomAttribute(displayAttributeBuilder); 
+0

Спасибо вам его работать @Antonio – Shiljo

+0

Конечно, если вы не возражаете, и если у вас есть ответ можете ли вы сказать мне, как добавить в него атрибут Order. Атрибут отображения имеет другие дополнительные параметры, такие как порядок, имя. Имя, которое вы мне показывали – Shiljo

+0

см. Мой обновленный ответ –

Смежные вопросы