属性 - 比较

发布于 2025-01-05 10:14:42 字数 1119 浏览 0 评论 0 原文

目前,我在根类中有一个声明,它使用 DefaultValueAttribute 描述符迭代派生类的属性并实例化属性的默认值。我想要做的是将其从简单的 DefaultValue 扩展为 XmlElement、XmlAttribute 以及 Xml 命名空间的序列化中包含的一系列属性。

我在扩展当前设计以处理多个属性而不加载大量 if/then/else 语句来处理各种定义的属性时遇到问题。

当前设计:

private void Initialize () {
  foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( this ) ) {
    XmlElementAttribute xel = ( XmlElementAttribute ) property.Attributes[typeof( XmlElementAttribute )];
    if( xel != null ) {
      this.AddElement( xel.ElementName , "" );
    }
    DefaultValueAttribute attr = ( DefaultValueAttribute ) property.Attributes[typeof( DefaultValueAttribute )];
    if( attr != null ) {
      property.SetValue( this , attr.Value );
    }
  }
}

建议设计:

private void Initialize () {
  foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( this ) ) {
    foreach( Attribute attr in property.Attributes ) {
      if( attr = typeof(XmlElementAttribute)){
        //do something
      }else if(attr = typeof(DefaultValueAttribute)){
        //do something
      }
    }
  }
}

Currently, i have a declaration in a root class that iterates through the properties of a deriving class and instantiates the Default Value of the property, using the DefaultValueAttribute descriptor. What i want to do is expand this from simply being for DefaultValue to also be XmlElement, XmlAttribute and the series of Attributes included in the Serialization of the Xml namespace.

I am having a problem with expanding the current design to handle multiple attributes without loading a ton of if/then/else statements to handle the various Defined Attributes.

Current Design:

private void Initialize () {
  foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( this ) ) {
    XmlElementAttribute xel = ( XmlElementAttribute ) property.Attributes[typeof( XmlElementAttribute )];
    if( xel != null ) {
      this.AddElement( xel.ElementName , "" );
    }
    DefaultValueAttribute attr = ( DefaultValueAttribute ) property.Attributes[typeof( DefaultValueAttribute )];
    if( attr != null ) {
      property.SetValue( this , attr.Value );
    }
  }
}

Suggestions Design:

private void Initialize () {
  foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( this ) ) {
    foreach( Attribute attr in property.Attributes ) {
      if( attr = typeof(XmlElementAttribute)){
        //do something
      }else if(attr = typeof(DefaultValueAttribute)){
        //do something
      }
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

权谋诡计 2025-01-12 10:14:42

您可以定义一个 Dictionary> (或将 object 替换为您的类的特定类型),并添加您想要为每个执行的代码type:

var dict = new Dictionary<Type, Action<object>>();
dict.Add(typeof(XmlElementAttribute), obj =>
{
  //do something
});

现在你可以测试你的字典是否包含该类型并执行委托:

foreach(Attribute attr in property.Attributes) 
{  
   var attributeType = attr.GetType();
   if(dict.ContainsKey(attributeType))
   {
     dict[attributeType](this);
   }
}

You could define a Dictionary<Type, Action<object>> (or replace object with the specific type of your class) and add the code you want to execute for each type:

var dict = new Dictionary<Type, Action<object>>();
dict.Add(typeof(XmlElementAttribute), obj =>
{
  //do something
});

Now you can just test whether your dictionary contains the type and execute the delegate:

foreach(Attribute attr in property.Attributes) 
{  
   var attributeType = attr.GetType();
   if(dict.ContainsKey(attributeType))
   {
     dict[attributeType](this);
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文