2

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() });

私には不明な理由で、プログラムはエラーを生成します。

デザイナで使用される引数、フィールド、またはプロパティのカスタム属性タイプが無効です。

4

2 に答える 2

0

CustomAttributeBuilderドキュメントの備考セクションを参照してください。

constructorArgs 配列の要素は、要素の型に制限されています。これらは、byte、sbyte、int、uint、long、ulong、float、double、String、char、bool、enum、型、オブジェクトにキャストされた以前の型のいずれか、または 1 次元のゼロのいずれかです。前のタイプのいずれかの に基づく配列。

XmlDocumenttype はリストにないため、コンストラクターの引数として使用できません。この制限は、C# 属性パラメーターの制限に由来します。許容されるパラメータ タイプのリストについては、C# 仕様の17.1.3 属性パラメータ タイプセクションを参照してください。

  • 次の型のいずれか: bool、byte、char、double、float、int、long、short、string。
  • 型オブジェクト。
  • タイプ System.Type。
  • public アクセシビリティがあり、それが入れ子になっている型 (存在する場合) も public アクセシビリティを持つ列挙型 (セクション 17.2)。
  • 上記の型の 1 次元配列。

コンストラクターpublic Class1(XmlDocument doc)は通常の C# クラスに対して完全に有効であり、属性クラスで宣言できます。ただし、属性をコードに適用する場合は使用できません。そして、これはあらゆる属性クラスの目標です。したがって、そのようなコンストラクターを宣言できても、属性クラスには意味がありません。

于 2014-07-08T10:37:28.740 に答える