2

クラスが を直接継承している場合にエラーを返す Style Cop ルールを作成したいと考えていますSystem.Web.UI.Page。見ているクラスを表すインスタンスを取得できますStyleCop.CSharp.Classが、そこから少し途方に暮れています。Class オブジェクト (System ではなく StyleCop のもの) にDeclarationは、継承されたクラス名を含む宣言内のすべてを取得できる属性があります。しかし、それは必ずしも一意性を保証するものではありません。

これを検出するのは簡単です:

public class Foobar : System.Web.UI.Page {}

しかし、このような状況は厄介になります...

using Page = System.Web.UI.Page;
public class Foobar : Page {}

特に、このような宣言を持つ他のクラスがある場合

using Page = Company.Some.Thing.Page;
public class Foobar : Page {}

厳密な型チェックを使用して、異なる名前空間にある同じ名前のクラスによってつまずかれないルールを作成するにはどうすればよいですか?

4

1 に答える 1

2

ソースコードではなくコンパイルされたコードに関心があるため、これは Stylecop ではなく FxCop の仕事です。

から継承する型のリストを取得するには、ちょっとしたリフレクション (実際にはイントロスペクションSystem.Web.UI.Page) を行う必要BaseTypeがありSystem.Web.UI.Pageます。

リフレクションを使用した基本的な例を次に示します。

    internal class Test2 : Test
    {
    }

    internal class Test : Program
    {
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
            {
                if (typeof(Program).IsAssignableFrom(type))
                {
                    if (type.BaseType == typeof(Program))
                    {
                        Console.WriteLine("strict inheritance for {0}", type.Name);
                    }
                    else
                    {
                        Console.WriteLine("no strict inheritance for {0}", type.Name);
                    }
                }
            }

            Console.Read();
        }
    }

no strict inheritance for Program
strict inheritance for Test
no strict inheritance for Test2
于 2013-02-06T18:01:08.247 に答える