有没有办法在c#的编译时区分非常量字段和常量字段?
我目前正在开发c#代码分析(FxCop)规则,以检查开发人员的代码是否存在命名不一致。
我一直在寻找的是一种只定位常数字段的方法。但他们在编译时如何宣布?是否有旗帜(我一直在研究“HasDefault”,但这并没有给我太多信息)。
我使用的是FxCop-API(FxCopSdk.dll& Microsoft.Cci.dll)。没有使用反射。
总结:如何使用代码分析(FxCop)区分非常量字段和常量字段,以及如何定位常量。
答案 0 :(得分:2)
进一步研究你提到的FxCop SDK,我找到了一个字段IsLiteral,它基本上是指在编译时指定了哪个值的成员。
这对你有用吗?
E.g
public class ClassFieldNamePrefixes : BaseIntrospectionRule
{
public ClassFieldNamePrefixes() :
base("ClassFieldNamePrefixes", "TutorialRules.TutorialRules",
typeof (ClassFieldNamePrefixes).Assembly)
{
}
public override ProblemCollection Check(Member member)
{
if (!(member.DeclaringType is ClassNode))
return this.Problems;
Field fld = member as Field;
if (fld == null)
return this.Problems;
if (fld.IsLiteral &&
fld.IsStatic &&
field.Flags.HasFlag(FieldFlags.HasDefault))
{
....
}
return this.Problems;
}
}
答案 1 :(得分:1)
如果我编译一些包含此类的程序集
namespace Foo
{
public static class Bar
{
public int Pointless()
{
const int Whatever = 1;
return Whatever;
}
}
}
课程外无法访问 Whatever
。我想,即使使用反射。事实上,它可以在IL中简化(这是猜想)。
Whatever
的名称纯粹是一个样式问题,对编译的程序集没有影响。如果是public
字段,例如
namespace Foo
{
public static class Bar
{
public const int Whatever = 1;
}
}
然后可以通过代码分析来分析名称。
鉴于公共非常量字段已经被
标记也许你根本不需要区分。
答案 2 :(得分:0)
我发现了一种有点肮脏的定位常量的方法。
使用以下内容将针对他们(但可能会给出误报):
Field field = member as Field;
if (field == null)
return null;
if (field.Flags.HasFlag(FieldFlags.HasDefault) && field.IsLiteral && Field.IsStatic)
{
// Your code here.
}