TypeDescriptor.AddAttributes()替换添加它的当前属性insead

时间:2010-10-22 13:54:03

标签: c# .net attributes typedescriptor

我有这部分代码:

var hasAttribute = TypeDescriptor.GetAttributes(property.DeclaringType).OfType<CrmTypeAttribute>()
            .Any((attr)
                    => ((CrmTypeAttribute)attr).Name == property.Name);

            if (!hasAttribute)
            {
                var crmTypeAttribute = new CrmTypeAttribute(property.Name, crmType);
                TypeDescriptor.AddAttributes(property.DeclaringType, crmTypeAttribute);
            }

它有两个问题:

  1. 由于某种原因,OfType返回一个空的IEnumerable,虽然它应该返回该类型的正确属性,并且我检查了。他们存在。
  2. 这是一个严重的问题。它不是添加属性,而是用crmTypeAttribute替换相同类型的旧属性。 我已将AllowMultiple标记为true。
  3. 有人能告诉我这段代码有什么问题吗? 编辑:
    由于某种原因,它只允许添加属性类型的一个属性,我在运行时添加了另一个属性类型并且它有效。

2 个答案:

答案 0 :(得分:1)

我认为您的问题源于您忽略了TypeDescriptionProvider来电中返回的AddAttributes

来自TypeDescriptor.AddAttributes上的Reflector:

  

将类级属性添加到   目标组件类型。

     

<强>参数

     

类型:目标组件的Type

     

属性:要添加到组件类的Attribute个对象数组。

     

返回值:用于添加指定属性的新创建的TypeDescriptionProvider

调用静态方法时始终会创建一个新的TypeDescriptionProvider实例。在添加更多属性并查询最近添加的属性时,您应该依赖这个新创建的提供程序实例。

答案 1 :(得分:0)

原来,该属性需要覆盖Attribute类的TypeId属性,以免被视为重复。
有关详细信息,请参阅here,它非常隐藏,也应在GetAttributes中提及。