C# 执行类型为XmlDocument的CustomAttributeBuilder时出错

C# 执行类型为XmlDocument的CustomAttributeBuilder时出错,c#,reflection.emit,getconstructor,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, n

我有以下代码作为使用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() });
由于我不知道的原因,程序会生成一个错误:

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

见文件的备注部分:

constructorArgs数组的元素仅限于元素 类型。它们可以是byte、sbyte、int、uint、long、ulong、float、double、, String、char、bool、enum、type,以及以前使用的任何类型 被强制转换为一个对象,或任何 以前的类型

不能将
XmlDocument
type用作构造函数参数,因为它不在列表中。此限制来自C#属性参数限制。可接受参数类型列表见C#规范章节:

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

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

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

你能告诉我为什么他们不把decimal作为有效的类型吗?同样的规则适用于CustomAttributeBuilder中显然适用于构造函数的属性和字段,当我设置一些十进制的属性值时,我遇到了同样的错误。因此,我能想到的唯一解决办法是,在自定义属性类型的新构造函数中,以JSON的形式传入一个字符串作为构造函数参数,并在反序列化后通过反射设置属性,这是我不喜欢做的,而且完全违背了这一点。这是CustomAttributeBuilder的一个严重限制。