我想创建一个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 {}
如何创建一个具有严格类型检查的规则,该规则不会被不同命名空间中具有相同名称的类绊倒?
答案 0 :(得分: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