2012-01-22 21 views
3

は、私は、このソリューションは喜んで働いていたと私は、この属性を追加しました:奇妙な属性エラー

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = true)] 
public class metadata : Attribute 
{ 
    string mid; 
    string mdescription; 
    Dictionary<string, string> mdata; 
    public string id 
    { 
     get 
     { 
      return mid; 
     } 
    } 
    public string description 
    { 
     get 
     { 
      return mdescription; 
     } 
    } 
    public Dictionary<string, string> data 
    { 
     get 
     { 
      return mdata; 
     } 
    } 
    public metadata(string thisid, string thisdescription, params KeyValuePair<string, string>[] thisdataarray) 
    { 
     mid = thisid; 
     mdescription = thisdescription; 
     mdata = new Dictionary<string, string>(); 
     if (thisdataarray != null) 
     { 
      foreach (KeyValuePair<string, string> thisvaluepair in thisdataarray) 
      { 
       mdata.Add(thisvaluepair.Key, thisvaluepair.Value); 
      } 
     } 
    } 
} 

私はエラーなしですべての[メタデータ(NULL、NULL)]、この属性のいくつかの宣言を追加しました。どういうわけか、コンパイル時に、各[metadata(null、null)]に対して、エラーCS0182:属性引数は定数式でなければならず、typeof式または属性パラメータタイプの配列作成式が発生しますが、またはファイルのみ、プロジェクトのみ。何が悪かったのか?ありがとう。

+1

ファイル名、行番号、列番号の不足について:これはオプションのパラメータでも問題です。私は後でこの問題に関するバグを報告しました。[C#コンパイラはコンパイル時エラーを報告するときにファイル名と行番号を出力できません](http://connect.microsoft.com/VisualStudio/feedback/details/763609/c-compiler -fails-to-emit-file-name-and-line-number-when-reporting-compile-time-error)を指定します。私は行って、そのバグレポートに 'params 'を使って状況をコメントします。 –

答えて

6

KeyValuePairは属性パラメータの型としてサポートされていないという問題があります。 C# Language specificationによると:

属性クラスのための位置と名前付きパラメータの種類がある属性パラメータの型、に限定されています。次の種類の

  • ワン:ブール値、バイト、文字、 double、float、int、 long、sbyte、short、string、uint、ulong、ushort。
  • タイプオブジェクトです。
  • タイプSystem.Type。
  • パブリック・アクセシビリティを持ち、入れ子になっているタイプが のパブリック・アクセシビリティを持つ場合は、列挙型です。
  • 上記のタイプの1次元配列。

回避策として、奇数メンバーがキーでメンバーが値である場合は、文字列の配列を渡すことができます。次に、属性コンストラクタ内で、あなたの辞書を作成することができます。

+0

ありがとうございました) – irisjay

+1

別の(Key、Value)ペアを取り、クラスに関連付ける必要のあるデータ項目ごとに新しい属性を作成します。 – shambulator

+0

それは働いた!素晴らしい – irisjay

0

あなたが配列を宣言する方法は疑わしいです、私はあなたがparamsキーワードが必要と思わないです。私はあなたが0以上のkeyvalueペア配列を望んでいるとは思わない、私はあなたが0以上のエントリを持つ単一の配列を探していると思います。 paramsキーワードを削除し、thisdataarrayのデフォルト値をnullに設定します。

+1

問題があるとは思わない。私はmsdn http://msdn.microsoft.com/en-us/library/w5zay9db(v=vs.100).aspxを読んだ後にそれを書いた。また、私はあなたの解決策を試してみましたが、それはうまくいきませんでした。( – irisjay