2013-09-24 70 views
2

嗨,大家好我在互聯網上瀏覽自定義屬性。我把握這個概念,但是,驚訝和混淆,看到他們通過屬性類的構造函數設置屬性值作爲參數,它沒有將任何參數作爲構造函數的值。請澄清核心概念。自定義屬性的構造函數如何獲取可選參數

[DeBugInfo(45, "Zara Ali", "12/8/2012", **Message = "Return type mismatch"**)] 
//like the Message here. 

    public class DeBugInfo : System.Attribute 
{ 
private int bugNo; 
private string developer; 
private string lastReview; 
public string message; 
public DeBugInfo(int bg, string dev, string d) 
    { 
    this.bugNo = bg; 
    this.developer = dev; 
    this.lastReview = d; 
    } 
    public int BugNo 
{ 
get 
{ 
return bugNo; 
} 

public string Developer 
{ 
get 
{ 
return developer; 
} 
} 
public string LastReview 
{ 
get 
{ 
return lastReview; 
} 

public string Message 
{ 
get 
{ 
return message; 
} 
    set 
    { 
    message = value; 
    } 
} 




////////////////////////// 

回答

4

屬性語法...與常規C#代碼有點不同。在普通的C#,如果你手工創建一個對象,這將是類似於對象初始化:

var obj = new DeBugInfo(45, "Zara Ali", "12/8/2012") { 
    Message = "Return type mismatch" 
}; 

然而,在現實中,屬性是不是真的以這種方式實例化,至少直到他們是絕對必需的。一個屬性實際上是原始的元數據衝壓成IL,其中包括:

  • 構造令牌
  • 參數的構造,簡單的值組成
  • 附加屬性/字段分配映射和對應的簡單數值

您實際上可以檢查所有這些信息,而無需實際創建類型的實例。但是如果你使用Attribute.GetAttributes等,會計算出它表示什麼,並且在運行時本質上應用了構造函數和映射。

對於一個完整的例子:

using System; 

class DeBugInfoAttribute : Attribute 
{ 
    public string Message { get; set; } 
    public DeBugInfoAttribute(int i, string j, string k) 
    { 
     // to show we never get here! 
     throw new NotImplementedException(); 
    } 
} 

[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")] 
static class Program 
{ 
    static void Main() 
    { 
     // this doesn't create the attribute, so no exception 
     foreach (var data in typeof(Program).GetCustomAttributesData()) 
     { 
      Console.WriteLine(data.AttributeType.Name); 
      var parameters = data.Constructor.GetParameters(); 
      int i = 0; 
      foreach (var arg in data.ConstructorArguments) 
      { 
       Console.WriteLine("{0}: {1}", 
        parameters[i++].Name, 
        arg.Value); 
      } 
      foreach (var binding in data.NamedArguments) 
      { 
       Console.WriteLine("{0}: {1}", 
        binding.MemberInfo.Name, 
        binding.TypedValue); 
      } 
     } 
     // but this does: BOOM! 
     var attribs = Attribute.GetCustomAttributes(typeof(Program)); 
    } 
} 
相關問題