相关疑难解决方法(0)

生成自定义编译时警告C#

我正在使用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)

谢谢!

c# compiler-construction postsharp custom-attributes

19
推荐指数
1
解决办法
4385
查看次数

如何从属性中抛出编译错误?

.NET中有一些属性(例如ObsoleteAttribute),它们能够阻止编译或至少抛出编译时警告,具体取决于它们的配置.

如何编写能够干扰编译的属性?有没有办法从微软以外的地方做到这一点?

.net c# attributes

6
推荐指数
1
解决办法
4998
查看次数

是否存在与 ObsoleteAttribute 实际上相反的属性?

换句话说,是否有一个Attribute标记将一段代码标记为不是太,而是太,因此还没有准备好广泛使用?

如果我必须创建一个自定义Attribute来完成此任务,那很好。我只是想先确定一下。

c# attributes

5
推荐指数
1
解决办法
634
查看次数

"NotSupported"属性?

是否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真的不回答这个问题,因为它们只提供运行时指导.我对编译时更感兴趣.

.net c# attributes

4
推荐指数
1
解决办法
1409
查看次数

Visual Studio 2008中的自定义编译器警告

自定义编译器警告
C#:如果源代码中使用某些方法,则在Visual Studio中创建自定义警告,
因为它们处理作者控制下的代码.

我们在我们的软件中使用第三方UI控件套件(DevExpress),我想在有人使用时生成警告MessageBox.Show("blah");而不是XtraMessageBox.Show("blah");

有没有办法做到这一点?

warnings compiler-warnings visual-studio-2008 visual-studio

3
推荐指数
1
解决办法
1209
查看次数

标记代码的属性

在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 c#

3
推荐指数
1
解决办法
354
查看次数

我可以强制C#中的命名空间之间的依赖关系

我可以限制特定命名空间中的类引用另一个特定命名空间中的类吗?两个名称空间都存在于同一.NET程序集中.

例:

namespace LegacyCode
{
    class LegacyClass { ... }
}

namespace NewCode
{
    class NewClass {...}
}
Run Code Online (Sandbox Code Playgroud)

我不希望'NewCode'中的类能够引用'LegacyCode'中的类.

选项:

  1. 有不同的程序集(使部署更难,构建需要更长时间)
  2. 使用像NDetect这样的工具(花钱!)

有没有人有任何其他想法?

c# class-design namespaces

3
推荐指数
2
解决办法
315
查看次数

如何在c#中创建[experimental]标签,抛出编译器警告

在c#中,我可以通过执行将某些功能标记为过时

[Obsolete]
void Foo()
{}
Run Code Online (Sandbox Code Playgroud)

这告诉编译器如果我正在使用此函数则抛出警告.

我想创建我自己的标签[实验],就像过时一样,发出警告告诉用户构建代码,该功能未经过充分测试并使用它可能会导致麻烦.

是否有可能做到这一点?怎么样?

c#

3
推荐指数
2
解决办法
1477
查看次数

用户定义的编译器警告或C#中的错误

是否有可能让一些代码让编译器生成编译警告或错误?

也许有属性?

**有了第一个答案和一些评论,我意识到我的问题并不像我预期的那样清晰,并希望它成为现实.我道歉.希望所有的贡献者仍然和我们在一起.
**

所以我更期待内部DSL.

某事物 喜欢

[MustAssign]
public string Val {get; set;]
Run Code Online (Sandbox Code Playgroud)

c# compiler-errors compiler-warnings

3
推荐指数
1
解决办法
808
查看次数

如果未调用基本方法,Visual Studio 会发出警告

我正在研究一种方法,如果我重写基类中的特定方法但忘记调用被重写的方法中的基方法,则 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 中需要的行为。

.net c# visual-studio

3
推荐指数
1
解决办法
1791
查看次数

规定类中需要属性 - 编译时

有没有办法规定类的客户端应该为类中的一组属性指定值.例如(见下面的代码),我是否可以规定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)

.net c# compiler-construction clr

2
推荐指数
1
解决办法
2225
查看次数