我在理解你的问题时遇到了一些困难,但让我试着澄清一下。
我有一个具有多个属性的对象
...
它将清除所有 CustomAttributes
在 C# 中,<access> <type> <name> { get; set; } 格式的类成员被称为“属性”而不是“属性”。另一方面,“属性”是注释的 C# 实现,例如您所指的自定义属性。
也就是说,我目前理解您的意思是您有一个自动生成的具有多个属性的类。您希望这些属性中的每一个都有自己的自定义属性,但是如果您编辑类,它们会在下次生成时被删除,并且您无法让类生成器包含自定义属性。
了解更多课程背景可能会有所帮助。例如,它是如何生成的?如果它是一个实体框架类,下面的 SO 问题可能会提供一些见解:
Add data annotations to a class generated by entity framework。一般来说,是(或者你可以制作)生成的类partial吗?如果是这样,那么您仍然可以按照上述问题答案中的方法,viz. 制作自己的部分类实现,以提供属性的自定义属性。
例如,如果您生成的类看起来(或可以看起来)像这样:
/// <auto-generated />
public partial class MyClass
{
public int Num1 { get; set; }
public int Num2 { get; set; }
public string Str1 { get; set; }
public string Str2 { get; set; }
}
您可以使用自定义注释编写分部类的另一部分,如下所示:
/// human generated
public partial class MyClass
{
[Submit]
public int Num1 { get; set; }
[Submit]
public int Num2 { get; set; }
[Submit]
public string Str1 { get; set; }
[Submit]
public string Str2 { get; set; }
}
同样,在不了解您的情况的情况下,我不确定这是否为您提供了所需的信息,但我希望它至少可以为您提供一个起点。
编辑
如果该类不是部分的,您可以考虑使用一个包装属性使用自定义属性的类来包装您生成的类。例如,
/// human generated
public class MyClassWrapper
{
private readonly MyClass wrapped;
public MyClassWrapper(MyClass wrapped)
{
this.wrapped = wrapped;
}
[Submit]
public int Num1 { get => this.wrapped.Num1; set => this.wrapped.Num1 = value; }
[Submit]
public int Num2 { get => this.wrapped.Num2; set => this.wrapped.Num2 = value; }
[Submit]
public string Str1 { get => this.wrapped.Str1; set => this.wrapped.Str1 = value; }
[Submit]
public string Str2 { get => this.wrapped.Str2; set => this.wrapped.Str2 = value; }
}
编辑 2
如果您希望以一些设计和运行时复杂性为代价获得更动态的解决方案,您可以考虑这个 SO 问题:How to add property-level Attribute to the TypeDescriptor at runtime?。它似乎解决了类似的问题--
真的,它是为 MS 的应用程序设置生成代码的,所以你不能以任何方式扩展它的属性。
我不会在这里完全重复 Gman 的解释,但基本上这种方法包括
- 获取类型(
MyClass)或myObject类型的实例
- 使用
TypeDescriptor.GetProvider(MyClass/myObject).GetTypeDescriptor(MyClass/myObject)获取类型或对象的基线ICustomTypeDescriptor
- 用这个基线描述符构造他的
PropertyOverridingTypeDescriptor
- 使用
TypeDescriptor.GetProperties(MyClass/myObject) 遍历MyClass/myObject 的属性定义。使用TypeDescriptor.CreateProperty 根据当前属性的定义创建一个新的属性定义,添加自定义属性EditorAttribute(或在您的情况下为SubmitAttribute),并使用3.中构造的PropertyOverridingTypeDescriptor 来使用新属性定义。
- 用3中构造的
PropertyOverridingTypeDescriptor构造他的TypeDescriptorOverridingProvider。
- 将新的属性定义应用于
MyClass/myObject 和TypeDescriptor.AddProvider