我正在使用VS2008,并希望根据属性上的自定义属性创建编译时警告/错误(如果可能).
目前有两个案例让我感兴趣:
[MyAttribute (typeof(MyClass)]
Run Code Online (Sandbox Code Playgroud)
MyClass必须实现一个接口.目前我在属性的构造函数中声明了这一点,但由于堆栈跟踪的性质,这不容易跟踪:
public MyAttribute (Type MyClassType)
{
System.Diagnostics.Debug.Assert(typeof(MyInterface).IsAssignableFrom(MyClassType),
"Editor must implement interface: " + typeof(MyInterface).Name);
}
Run Code Online (Sandbox Code Playgroud)
我感兴趣的第二种情况是我在属性中定义了一个类型,如果该类型实现了一个接口,那么如果另一个属性不存在则应该显示警告.
IE if(MyClass.Implements(SomeInterface)&&!Exists(SomeAttibute)){Generate Warning}
[MyAttribute(typeof(MyClass)]
// Comment next line to generate warning
[Foo ("Bar")]
Run Code Online (Sandbox Code Playgroud)
谢谢!
.NET中有一些属性(例如ObsoleteAttribute),它们能够阻止编译或至少抛出编译时警告,具体取决于它们的配置.
如何编写能够干扰编译的属性?有没有办法从微软以外的地方做到这一点?
换句话说,是否有一个Attribute标记将一段代码标记为不是太旧,而是太新,因此还没有准备好广泛使用?
如果我必须创建一个自定义Attribute来完成此任务,那很好。我只是想先确定一下。
是否Attribute在.Net Framework中建议将代码标记为"不支持"?
到目前为止,我一直在使用,ObsoleteAttribute但它并不总是完全准确.例如,目前我正在编写托管的FMOD包装器,我想清楚地标记仅适用于不支持的平台的属性,枚举值等.
假设我有类似枚举的东西来确定音频文件的格式.我想明确指出,对于.Net端口至少,某些值是不相关的.例如:
enum SoundFormat{
Wav,
Mp3,
OggVorbis,
[Obsolete("Xbox360 only")] Xma,
[Obsolete("GameCube only")] GcadPcm,
[Obsolete("PS2/PSP only")] Vag,
}
Run Code Online (Sandbox Code Playgroud)
虽然使用Obsolete作品和某种用途的目的相同,但它也具有误导性,因为它们在技术上不会因为不受支持而过时.这是最终没有什么影响的事情之一,但每当我把Obsolete它放在不准确的地方时,它总会让我烦恼.
PS:在它建议之前,NotImplementedException并且NotSupportedException真的不回答这个问题,因为它们只提供运行时指导.我对编译时更感兴趣.
自定义编译器警告和
C#:如果源代码中使用某些方法,则在Visual Studio中创建自定义警告,
因为它们处理作者控制下的代码.
我们在我们的软件中使用第三方UI控件套件(DevExpress),我想在有人使用时生成警告MessageBox.Show("blah");而不是XtraMessageBox.Show("blah");
有没有办法做到这一点?
在c#中有一些属性,如[废弃],它们会创建将在visual studio中显示的编译器警告.
是否有一个属性可用于标记方法或带有注释的类,当我编译时,应该在visual studio中显示为警告?
就像是:
[TBD(Msg="Please change me after 2010 07 20")]
public void Foo(){
}
Run Code Online (Sandbox Code Playgroud)
或者是否有可能从System.Attribute派生并创建自己的属性,配置visual studio以使其行为与我所描述的一样.
UPDATE
感谢大家的回答,我接受了Robaticus的答案,因为他向我展示了我真正需要的解决方案:
#warning Message
Run Code Online (Sandbox Code Playgroud)
显示我想要的所需消息,它没有任何开销.谢谢!
但是我搜索的方向错误,因此提出了错误的问题.对于那些正在阅读这篇文章并且对初始问题的答案感兴趣的人,我发现Mark Rushakoff 发布的链接 非常有趣.在这篇文章中,Pablo Fernandez展示了一种使用属性属性来完成我所要求的聪明方法.
我可以限制特定命名空间中的类引用另一个特定命名空间中的类吗?两个名称空间都存在于同一.NET程序集中.
例:
namespace LegacyCode
{
class LegacyClass { ... }
}
namespace NewCode
{
class NewClass {...}
}
Run Code Online (Sandbox Code Playgroud)
我不希望'NewCode'中的类能够引用'LegacyCode'中的类.
选项:
有没有人有任何其他想法?
在c#中,我可以通过执行将某些功能标记为过时
[Obsolete]
void Foo()
{}
Run Code Online (Sandbox Code Playgroud)
这告诉编译器如果我正在使用此函数则抛出警告.
我想创建我自己的标签[实验],就像过时一样,发出警告告诉用户构建代码,该功能未经过充分测试并使用它可能会导致麻烦.
是否有可能做到这一点?怎么样?
是否有可能让一些代码让编译器生成编译警告或错误?
也许有属性?
**有了第一个答案和一些评论,我意识到我的问题并不像我预期的那样清晰,并希望它成为现实.我道歉.希望所有的贡献者仍然和我们在一起.
**
所以我更期待内部DSL.
某事物 喜欢
[MustAssign]
public string Val {get; set;]
Run Code Online (Sandbox Code Playgroud) 我正在研究一种方法,如果我重写基类中的特定方法但忘记调用被重写的方法中的基方法,则 Visual Studio 会发出警告。例如:
class Foo
{
[SomeAttributeToMarkTheMethodToFireTheWarning]
public virtual void A() { ... }
}
class Bar : Foo
{
public override void A()
{
// base.A(); // warning if base.A() is not called
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我找不到一种方法,并且可能无法让编译器直接发出这样的警告。有什么想法可以实现这一点,即使它是第 3 方工具或使用新 Roslyn .NET 编译器平台中的某些 API?
更新:例如,在 AndroidStudio (IntelliJ) 中,如果您onCreate()在任何活动中重写但忘记调用基本方法super.onCreate(),您会收到警告。这就是我在 VS 中需要的行为。
有没有办法规定类的客户端应该为类中的一组属性指定值.例如(见下面的代码),我是否可以规定Employment类中的"EmploymentType"属性应该在编译时指定?我知道我可以使用参数化构造函数等.我特意在编译期间输出自定义警告或错误.那可能吗?
public class Employment
{
public EmploymentType EmploymentType {get; set;}
}
public enum EmploymentType
{
FullTime = 1,
PartTime= 2
}
public class Client
{
Employment e = new Employment();
// if i build the above code, i should get a error or warning saying you should specify value for EmploymentType
}
Run Code Online (Sandbox Code Playgroud)