gpt4 book ai didi

c# - 如何动态地将 CustomAttribute 添加到所有对象属性?

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:23 29 4
gpt4 key购买 nike

我有一个具有多个属性的对象,如下所示:

public int num1 { get; set; }

public int num2 { get; set; }

public string str1 { get; set; }

public string str2 { get; set; }

这些属性位于一个动态生成的类中,因此它将删除它们上的所有 CustomAttributes。

我尝试添加

[Submit]
MyClass myObject

但它并没有传播到我的对象属性上

有没有办法在 C# 中动态地做到这一点?

最佳答案

我在理解您的问题时遇到了一些困难,但让我尝试澄清一下。

I have an object with multiple attributes ... it will erase all CustomAttributes

在 C# 中,格式为 <access> <type> <name> { get; set; } 的类成员被称为“属性”而不是“属性”。另一方面,“属性”是注释的 C# 实现,例如您所指的自定义属性。

也就是说,我目前的理解是您有一个自动生成的具有多个属性的类。您希望这些属性中的每一个都有自己的自定义属性,但如果您编辑类,它们将在下次生成时被删除,并且您无法让类生成器包含自定义属性。

了解更多类背景可能会有所帮助。例如,它是如何生成的?如果它是 Entity Framework 类,则以下 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? .它似乎解决了类似的问题——

Really, it's for MS's Application Settings that generates code, so you can't extend it in any way property-wise.

我不会在这里完全重复 Gman 的解释,但基本上这种方法包括

  1. 获取类型 ( MyClass ) 或 myObject 类型的实例
  2. 使用TypeDescriptor.GetProvider(MyClass/myObject).GetTypeDescriptor(MyClass/myObject)获取类型或对象的基线 ICustomTypeDescriptor
  3. 构建他的 PropertyOverridingTypeDescriptor有了这个基线描述符
  4. 遍历 MyClass/myObject “属性”定义为 TypeDescriptor.GetProperties(MyClass/myObject) .使用 TypeDescriptor.CreateProperty根据当前属性的定义创建新的属性定义,添加自定义属性 EditorAttribute (或在您的情况下为 SubmitAttribute ),并使用 PropertyOverridingTypeDescriptor在 3. 中构造以使用新的属性定义。
  5. 构建他的 TypeDescriptorOverridingProviderPropertyOverridingTypeDescriptor在 3 中构建。
  6. 将新属性定义应用于 MyClass/myObjectTypeDescriptor.AddProvider

关于c# - 如何动态地将 CustomAttribute 添加到所有对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165406/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com