1

基本クラスを作成しています。派生クラスに継承されている場合は、属性を適用する必要があります。そうでない場合は、コンパイルエラーがスローされます。出来ますか?

public class MyAttribte : Attribute
{
    public string TestString {get; set; }
}

public class Base
{
}

/*Attribute must be applied else throw compile time error.*/
[MyAttribte]
public class Derived : Base { }
4

2 に答える 2

3

強制することはできませんが、Attribute指定されていない場合は実行時に例外をチェックしてスローすることができます。

var d1 = new Derived1(); // OK
var d2 = new Derived2(); // throw error at run-time

public class Base
{
    public Base()
    {
        CheckCustomAttribute();

    }

    private void CheckCustomAttribute()
    {
        if (!(this.GetType() == typeof(Base))) // Ingore Base for attribute
        {
            //  var attr = System.Attribute.GetCustomAttributes(this.GetType()).SingleOrDefault(t=>t.GetType() == typeof(CustomAttribute));
            var attr = System.Attribute.GetCustomAttributes(this.GetType()).SingleOrDefault(t => typeof(CustomAttribute).IsAssignableFrom(t.GetType())); // to include derived type of Custom attribute also
            if (attr == null)
            {
                throw new Exception(String.Format("Derived class {0} doesnot apply {1} attribute", this.GetType().Name, typeof(CustomAttribute).Name));
            }
        }
    }
}

[CustomAttribute]
class Derived1 : Base
{
}

class Derived2 : Base
{
}
class CustomAttribute : System.Attribute
{
}
于 2013-01-11T06:18:33.473 に答える
1

これは、 PostSharpを使用してコンパイル時に実行できます。コンパイル後に静的コードウィービング(ポストコンパイルのプロセスとも呼ばれます)を使用するAOPフレームワークは、コード設計を検証するためのAPIを提供します。これを示す簡単な例を作成しました。属性を定義する

public class MyAttribute : Attribute
{

}

次に、この属性を適用するクラスに進みます。エラーを取得するために属性をコメントアウトします。

//[MyAttribute]
internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Hello World");
    }
}

今あなたのクレートAspectMyAttributeコンパイル後の時点で存在するかどうかをチェックし、存在しProgramない場合はエラーメッセージを入力します。

[Serializable]
public class MyValidationAspect : AssemblyLevelAspect
{
    public override bool CompileTimeValidate(_Assembly assembly)
    {
        IEnumerable<object> myAttributes = typeof (Program).GetCustomAttributes(inherit: true)
                                                           .Where(atr => atr.GetType() == typeof (MyAttribute));

        if (!myAttributes.Any())
            Message.Write(MessageLocation.Of(typeof (Program)), SeverityType.Error, "DESIGN1",
                          "You haven't marked {0} with {1}", typeof (Program), typeof (MyAttribute));

        return base.CompileTimeValidate(assembly);
    }
}

次に、次のように、アセンブリレベルでこのアスペクトを定義します。

[assembly: MyValidationAspect]

したがって、ソリューションを構築しようとすると、エラーが発生します。

ここに画像の説明を入力してください

PostSharpPlay.exe私のコンソールアセンブリの名前です。前にコメントを削除するMyAttributeと、ソリューションがコンパイルされ、エラーは発生しません。

ここに画像の説明を入力してください

于 2013-01-11T11:14:48.967 に答える