代码之家  ›  专栏  ›  技术社区  ›  Stef Heyenrath Dariusz Woźniak

C中的自定义属性:如何创建定义其他几个属性的属性?

  •  3
  • Stef Heyenrath Dariusz Woźniak  · 技术社区  · 14 年前

    我在“我的名字”字段中定义了以下属性:

    [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(MyResources))]
    [Display(Order = 0, Name = ResXStrings.UserName, ResourceType = typeof(MyResources))]
    public string Name { get; set; }
    

    我要创建一个如下所示的自定义属性:

    [MyAttribute(DisplayName = "Username", ErrorMessage = "ValidationErrorRequiredField", ResourceType = typeof(MyResources))]
    public string Name { get; set; }
    

    它在代码中定义了另外两个( 要求的 显示 属性。

    如何实现这一点?

    更新 这是不可能的。 感谢所有帮助回答我问题的人。

    4 回复  |  直到 11 年前
        1
  •  2
  •   Martin Harris    14 年前

    我觉得你做不到。由于属性的使用者经常按类型找到它们,您的新属性必须是 二者都 RequiredAttribute和DisplayAttribute。C不支持多重继承,因此无法创建这样的类。

        2
  •  2
  •   Rob Levine    14 年前

    我很确定你不能这样做。问题是,属性只是附加到类型、方法、属性等的一点元数据,而不是 任何东西。

    由消耗元数据的代码决定如何使用元数据以及如何操作元数据。

    即使属性包含一些函数代码(例如 System.Web.Mvc.ActionFilterAttribute )就是这样 消费 调用它的属性。

    换句话说,为了实现你想要的,你必须改变属性的消费者来理解你的新属性。

        3
  •  1
  •   Anton Gogolev    14 年前

    现在有一种方法可以使用自定义属性来实现这一点。你可以尝试实现 ICustomTypeDescriptor 添加您想要的任何属性,但我怀疑它在每个场景中都得到支持。

        4
  •  0
  •   this. __curious_geek    14 年前

    这是 不可能直接 但是你可以用一些 设计中的调整 你的申请,但我会 不建议这样做 因为,如果你这样做的话 严重违反SRP 把两个不同的职责放到同一个班级。

    记住,一个班必须总是有一个 改变的理由。