【问题标题】:Adding an Attribute for property in runtime (for design-time purposes)在运行时为属性添加属性(用于设计时目的)
【发布时间】:2010-07-12 17:57:42
【问题描述】:

我需要在运行时为某些属性添加一个属性(出于设计时目的)。我知道我可以在课堂上这样做:

TypeDescriptor.AddAttributes(typeof(MyType), new MyRuntimeAttribute());

但我找不到任何方法来为属性做同样的事情。

有什么建议吗?

UPD:确切的任务如下:

public class BaseClass {
  public BaseClass(string name) { Name = name; }
  public Name { get; set; }
}
public class Descendant1: BaseClass {
  public Descendant1() : base("Default Name 1") { }
}
...
public class DescendantN: BaseClass {
  public DescendantN() : base("Default Name N") { }
}

我希望每个后代在 Name 属性中都有各自的 DefaultValueAttribute,并具有相应的默认名称。而且我不想在每个血统上硬编码 DefaultValueAttribute :)

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您不能动态添加或删除属性。请注意,TypeDescriptor 实际上也没有向类添加属性:如果您检查 typeof(MyType).GetCustomAttributes(false) 在使用 MyRuntimeAttribute 附加属性后返回的数组,您会注意到它不是它的一部分。

    既然你提到了设计时,你可以做的是动态修改属性。那是你真正想要做的吗?

    另见:

    【讨论】:

    • 抱歉,没有。我刚刚调查了一下,现在我认为带有 GetProperties 覆盖的 TypeConverter 实现就是我所需要的(PropertyDescriptorAdaptor 将返回修改后的 AttributesCollection;基于msdn.microsoft.com/en-us/library/… 文章)。经过一些测试,我会在这里发布结果。但是,感谢您提供第二个链接,那里发布的答案非常有趣。
    • @Dr.Snail:再次阅读该代码:这不是向现有类添加属性,而是在运行时派生类并向该类添加属性。
    【解决方案2】:

    您还可以提供一个控件设计器,并在该设计器中覆盖 PreFilterProperties。虽然这通常用于隐藏属性,但也可用于添加属性。

    http://www.codeproject.com/KB/webforms/HidingProperties.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多