使用类型XmlDocument执行CustomAttributeBuilder时出错

时间:2014-07-08 10:30:04

标签: c# reflection.emit getconstructor

我将以下代码作为使用reflection.emit

生成接口的系统的一部分
class Class1:Attribute 
{
    public Class1(XmlDocument doc) 
    {
    }
}

var type = typeof(Class1);
var ctore = type.GetConstructor(new[] { typeof(XmlDocument) });
var cab = new CustomAttributeBuilder(ctore, new object[] { new XmlDocument() });

由于我不知道的原因,程序会生成错误:

  

在参数,字段或属性中使用的设计器自定义属性类型无效。

2 个答案:

答案 0 :(得分:0)

请参阅CustomAttributeBuilder文档的备注部分:

  

constructorArgs数组的元素仅限于元素   类型。它们可以是byte,sbyte,int,uint,long,ulong,float,double,   字符串,字符,布尔值,枚举,类型,以及任何以前的类型   被转换为一个对象,或任何一个基于零的基于零的数组   以前的类型。

您不能将XmlDocument类型用作构造函数参数,因为它不在列表中。此限制来自C#属性参数限制。有关可接受参数类型的列表,请参阅C#规范的17.1.3 Attribute parameter types部分:

  • 以下类型之一:bool,byte,char,double,float,int,long,short,string。
  • 类型对象。
  • 类型System.Type。
  • 枚举类型,前提是它具有公共可访问性和类型 嵌套的(如果有的话)也具有公共可访问性(Section 17.2)。
  • 上述类型的一维数组。

构造函数public Class1(XmlDocument doc)对常规C#类完全有效,您可以在属性类中声明它。但是,当您将属性应用于代码时,您无法使用它。这是任何属性类的目标。所以,尽管你可以声明这样的构造函数,但它对于属性类没有任何意义。

答案 1 :(得分:0)

我找到了解决方法。我将使用类XmlAttributeAttribute。谢谢。