1

こんにちは、カスタム属性を求めてインターネットをサーフィンしています。私は概念を理解していますが、属性クラスのコンストラクターを介してプロパティ値をパラメーターとして設定し、コンストラクターから値としてパラメーターを取得していないことに驚き、混乱しています。コアコンセプトを明確にしてください。

[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

1 に答える 1

4

属性の構文は ... 通常の C# コードとは少し異なります。通常の C# では、そのオブジェクトを手動で作成する場合、それはオブジェクト初期化子に似ています。

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

ただし、実際には、属性がこのように実際にインスタンス化されることはありません。少なくとも、属性が絶対に必要になるまではそうではありません。属性は、実際には IL にスタンプされた生のメタデータであり、次のもので構成されます。

  • コンストラクタトークン
  • 単純な値で構成されるコンストラクターのパラメーター
  • 追加のプロパティ/フィールド割り当てマッピングと対応する単純な値

型のインスタンスを実際に作成しなくても、このすべての情報を実際に調べることができます。しかし、Attribute.GetAttributesetc を使用すると、それが何を表しているかを把握し、基本的に実行時にコンストラクターとマッピングを適用します。

完全な例:

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));
    }
}
于 2013-09-24T13:04:10.237 に答える