在.Net中使用ObsoleteAtribute时,它会为您提供编译器警告,告诉您对象/方法/属性已过时,应该使用其他东西.我目前正在开发一个需要大量重构前雇员代码的项目.我想编写一个自定义属性,我可以用它来标记将生成编译器警告的方法或属性,这些警告会给出我写的消息.像这样的东西
[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
Public Sub DoEverything()
End Sub
我想要生成一个编译器警告,上面写着"这段代码sux,应该看一下".我知道如何创建自定义属性,问题是我如何使它在visual studio中生成编译器警告.
不知道这是否有效,但值得一试.
你不能扩展Obsolete,因为它是最终的,但也许你可以创建自己的属性,并将该类标记为过时,如下所示:
[Obsolete("Should be refactored")] public class MustRefactor: System.Attribute{}
然后,当您使用"MustRefactor"属性标记方法时,可能会显示编译警告.
我说"也许"和"可能"因为我没试过这个.请告诉我,如果它不起作用,我将删除答案.
问候!
更新:测试它.它会生成编译时警告,但错误消息看起来很有趣,您应该亲眼看到并选择.这非常接近您想要实现的目标.
更新2:使用此代码它会生成此警告(不是很好,但我不认为有更好的东西).
public class User { private String userName; [TooManyArgs] // Will show warning: Try removing some arguments public User(String userName) { this.userName = userName; } public String UserName { get { return userName; } } [MustRefactor] // will show warning: Refactor is needed Here public override string ToString() { return "User: " + userName; } } [Obsolete("Refactor is needed Here")] public class MustRefactor : System.Attribute { } [Obsolete("Try removing some arguments")] public class TooManyArgs : System.Attribute { }
在某些编译器中,您可以使用#warning发出警告:
#warning "Do not use ABC, which is deprecated. Use XYZ instead."
在Microsoft编译器中,您通常可以使用消息编译指示:
#pragma message ( "text" )
你提到过.Net,但没有说明你是用C/C++还是用C#编程.如果您使用C#进行编程,那么您应该知道C#支持#warning格式.
我们目前正处于大量重构的中间,我们无法立即解决所有问题.我们只需使用#warning preproc命令,我们需要返回并查看代码.它出现在编译器输出中.我不认为你可以把它放在一个方法上,但是你可以把它放在方法里面,而且它仍然很容易找到.
public void DoEverything() { #warning "This code sucks" }
现在可以使用Roslyn(Visual Studio 2015).你可以建立一个代码分析器来检查自定义属性
我不相信这是可能的.ObsoleteAttribute由编译器专门处理,并在C#标准中定义.为什么ObsoleteAttribute不被接受?在我看来,这正是它所针对的情况,并准确地实现了您的需求!
另请注意,Visual Studio也会即时获取由ObsoleteAttribute生成的警告,这非常有用.
不要意味着无益,只是想知道你为什么不热衷于使用它...
不幸的是,ObsoleteAttribute是密封的(可能部分是由于特殊处理),因此您无法从中继承自己的属性.
从C#标准: -
属性Obsolete用于标记不再使用的类型和类型成员.
如果程序使用使用Obsolete属性修饰的类型或成员,则编译器会发出警告或错误.具体而言,如果未提供错误参数,或者提供了错误参数且值为false,则编译器会发出警告.如果指定了error参数并且值为true,则编译器会发出错误.
这不能总结你的需求吗?......你不会做得比我想象的更好.
在VS 2008中(+ sp1)#warnings在Clean Soultion&Rebuild Solution之后的错误列表中没有正确显示,并非全部.仅在打开特定类文件后,错误列表中会显示一些警告.所以我被迫使用自定义属性:
[Obsolete("Mapping ToDo")] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)] public class MappingToDo : System.Attribute { public string Comment = ""; public MappingToDo(string comment) { Comment = comment; } public MappingToDo() {} }
所以当我用它标记一些代码时
[MappingToDo("Some comment")] public class MembershipHour : Entity { // ..... }
它会产生如下警告:
Namespace.MappingToDo已过时:'Mapping ToDo'.
我无法更改警告的文字,"有些评论"未显示错误列表.但它会跳到文件中的适当位置.因此,如果您需要更改此类警告消息,请创建各种属性.
你要做的是滥用属性.而是使用Visual Studio任务列表.您可以在代码中输入注释,如下所示:
//TODO: This code sux and should be looked at public class SuckyClass(){ //TODO: Do something really sucky here! }
然后从菜单中打开"查看/任务列表".任务列表有两个类别,用户任务和注释.切换到评论,你会看到你的所有// Todo:那里.双击TODO将跳转到代码中的注释.
人