Attributeのテストとカスタマイズに関するコード

6187 ワード

『西夏普入門経典』より
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public class XXXAttribute : Attribute
    {
        public XXXAttribute(System.Type testCase)
        {
            TestCase = testCase;
        }

        public readonly System.Type TestCase;

        public void Test()
        {
            object o = Activator.CreateInstance(TestCase);
        }
    }

    public class TestAnObject
    {
        public TestAnObject()
        {
            SomeCodeOrOther scooby = new SomeCodeOrOther();
            if (scooby.Do() != 999)
                throw new Exception("Pesky Kids");
        }
    }

    [XXX(typeof(TestAnObject))]
    public class SomeCodeOrOther
    {
        public SomeCodeOrOther()
        {

        }

        public int Do()
        {
            return 999;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Assembly A = Assembly.GetExecutingAssembly();
            System.Type[] types = A.GetExportedTypes();

            foreach (System.Type t in types)
            {
                Console.WriteLine("Checking type {0}", t.ToString());

                object[] atts = t.GetCustomAttributes(typeof(XXXAttribute), false);

                if (atts.Length == 1)
                {
                    Console.WriteLine("  Found XXXAttribute: Running Test");
                    XXXAttribute tca = atts[0] as XXXAttribute;

                    try
                    {
                        tca.Test();
                        Console.WriteLine("PASSED");
                    }
                    catch (System.Exception ex)
                    {
                        Console.WriteLine("FAILED");
                        Console.WriteLine(ex.Message);
                    }
                }
            }

            Console.Read();
        }
    }
}