2

我想创建一个 Style Cop 规则,如果一个类直接继承自System.Web.UI.Page. 我能够获得一个StyleCop.CSharp.Class代表我正在查看的任何类的实例,但从那里我有点不知所措。Class 对象(StyleCop 的,而不是 System)有一个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

这是 FxCop 的工作,而不是 Stylecop,因为您对编译后的代码感兴趣,而不是代码。

您只需要进行一些反思(实际上是自省)来获取继承自的类型列表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 回答