2012-01-22 103 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到發出,文件名稱和行號,當報告方法編譯時錯誤)。我會去用'params'在bug報告中添加一條評論。 –

回答

6

問題是KeyValuePair不支持作爲屬性參數類型。 按照C# Language specification

的類型屬性類的位置和命名參數的僅限於該屬性的參數類型,它們是:

  • 其中一個以下類型的:布爾,字節,字符, double,float,int, long,sbyte,short,string,uint,ulong,ushort。
  • 類型對象。
  • 類型System.Type。
  • 一個枚舉類型,只要它具有公共可訪問性,並且它嵌套(如果有)的 中的類型也具有公共可訪問性。
  • 上述類型的一維數組。

作爲解決方法,您可以傳遞一個字符串數組,其中奇數成員是鍵,甚至成員都是值。然後在屬性構造函數中你可以創建你的Dictionary。

+0

謝謝。生病嘗試 – irisjay

+1

或者,創建一個新的屬性,它採用單獨的(鍵,值)對並將其應用於每個需要與類關聯的數據項。 – shambulator

+0

它的工作!真棒 – irisjay

0

你聲明數組的方式是可疑的,我不認爲你需要params關鍵字。我不認爲你想要0個或更多的keyvaluepair數組,我認爲你正在尋找一個包含0個或更多條目的單個數組。除去params關鍵字,並將thisdataarray的默認值設置爲null。

+1

我不認爲有問題。我在閱讀MSDN http://msdn.microsoft.com/en-us/library/w5zay9db(v=vs.100).aspx後寫了它。另外,我嘗試了你的解決方案,但它沒有工作:( – irisjay