0

CallCommonCode()が呼び出されたときに属性コンストラクターを自動的に呼び出す方法はありますCodedMethod()か?

using System;

[AttributeUsage(AttributeTargets.Method|AttributeTargets.Struct,
                   AllowMultiple=false,Inherited=false)]
public class CallCommonCode : Attribute
{
    public CallCommonCode() { Console.WriteLine("Common code is not called!"); }
}

public class ConcreteClass {

  [CallCommonCode]
  protected void CodedMethod(){
     Console.WriteLine("Hey, this stuff does not work :-(");
  }
  public static void Main(string[] args)
  {
     new ConcreteClass().CodedMethod();
  }
}
4

1 に答える 1

2

いいえ、属性は関数とは独立して存在するためです。属性をスキャンすることも、関数を実行することもできますが、両方を同時に実行することはできません。

属性のポイントは、追加のメタデータでタグを付けることですが、厳密に言えば、実際にはコード自体の一部ではありません。

この状況で通常行うことは、関数のタグをスキャンすることです。それがビジネスロジックに反する場合は、ある種の例外をスローします。しかし、一般的に、属性は単なる「タグ」です。

class Program
{
    [Obsolete]
    public void SomeFunction()
    {

    }

    public static void Main()
    {
        // To read an attribute, you just need the type metadata, 
        // which we can get one of two ways.
        Type typedata1 = typeof(Program);       // This is determined at compile time.
        Type typedata2 = new Program().GetType(); // This is determined at runtime


        // Now we just scan for attributes (this gets attributes on the class 'Program')
        IEnumerable<Attribute> attributesOnProgram = typedata1.GetCustomAttributes();

        // To get attributes on a method we do (This gets attributes on the function 'SomeFunction')
        IEnumerable<Attribute> methodAttributes = typedata1.GetMethod("SomeFunction").GetCustomAttributes();
    }
}
于 2013-02-07T15:54:10.460 に答える