C# 通过TypeBuilder添加DisplayAttribute
请帮助我为一个属性添加DisplayAttribute,我尝试过,但得到的Consurtor错误为nullC# 通过TypeBuilder添加DisplayAttribute,c#,C#,请帮助我为一个属性添加DisplayAttribute,我尝试过,但得到的Consurtor错误为null var fieldName = string.Format("Prop{0}", fieldName); FieldBuilder fieldBuilder = segmentBuilder.DefineField(fieldName, typeof(string), FieldAttributes.Private);
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; }
}
使用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);
使用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);
当然,若你们不介意的话&若你们有答案的话,你们能告诉我如何在其中添加Order属性吗。“显示”属性还有其他参数,如顺序、名称。您显示的名称meI之前遇到空构造函数错误。你救了我一天。我不知道我们可以传递类型[0],非常感谢。因此,不管怎样,什么是类型[0],而不是新的类型[0],您也可以使用静态属性Type.EmptyTypes,它表示类型的空数组。当然,如果您不介意,如果您有答案,请告诉我如何在其中添加Order属性。“显示”属性还有其他参数,如顺序、名称。您显示的名称meI之前遇到空构造函数错误。你救了我一天。我不知道我们可以传递类型[0],非常感谢。因此,不管怎样,什么是类型[0],而不是新的类型[0],您还可以使用静态属性Type.EmptyTypes,它表示类型的空数组。