2013-07-05 110 views
-2

我正在使用T4生成一些代碼。代碼將位於名爲「MyClass.generated.cs」的類中,典型的輸出將如下所示。無法防止「代碼分析」警告

//<autogenerated/> 
namespace MyNamespace 
{ 
    using System; 
    using System.CodeDom.Compiler; 

    [GeneratedCode("T4", "1.0.0.0")] 
    public partial class MyClass: SomeBaseClass 
    { 
     private SomeBaseClass myBackingField; 
    } 
} 

然而,即使類裝飾用GeneratedCodeAttribute,我仍然得到一個代碼分析警告如下:

字段「MyNamespace.MyClass.myBackingField」從未分配,並會總是有它的默認值空

我必須確保項目屬性代碼分析 →「抑制生成代碼的結果(僅管理)」複選框被選中。

請注意,我瞭解警告的意思 - 我只是想知道如何抑制它:)

可能的解決方案 我可以修改我的發電機使用鎮壓,抑制特定的警告,但是這是額外的工作,我不應該做(因爲生成的代碼應該被代碼分析忽略)。

相關問題

EDIT與背景歷境 實際生成的代碼基本上是一個包裝周圍SomeBaseClass。命名空間中有100多種類型,我想改變這些類型的子集的行爲。還有其他警告正在產生 - 我只是以此爲例。例如,考慮一下有SomeBaseClass.MyObsoleteProperty的房產,該房產裝飾着ObsoleteAttribute。我的代碼生成器仍然會創建MyClass.MyObsoleteProperty這會引發代碼分析警告。

另一個例子是SomeBaseClass(來自第三方)本身會自動提出代碼分析警告,如果他們不屑檢查它們(例如,類可能不符合CLS)。我的包裝會重新創建他們有的任何錯誤(並且這實際上是所需的行爲)。

+0

好*是*什麼打算分配值給'myBackingField'?你生成的代碼是否有一個設置字段的構造函數會對你有用嗎? (並在同一時間只讀。) –

+0

嗨喬恩 - 基本上,有100多個生成的類,我將爲其中大約一半的實現部分類。對於那一半,是的,他們將會有場。我生成全部100個的原因是我使用單個T4模板爲特定命名空間的每個成員生成一個類。 –

+1

好吧,聽起來好像你應該接受警告,或者有兩個單獨模板的麻煩。畢竟,在另外一半的班級中不需要一個領域遠非理想。 –

回答

1

我想通了 - 這不是代碼分析警告 - 這是一個編譯器警告。

因此,唯一的方法來禁用它是修改發電機在編譯指令中的類封裝到suppress compiler warnings,如

#pragma warning disable warning-list 

// Now generate some code 

#pragma warning restore warning-list 

警告 注意,這是一個危險的特性 - 編譯器警告是有一個原因!儘量將其用於儘可能小的部分。

更多信息可以在編譯器警告和錯誤hereSuppressing "is never used" and "is never assigned to" warnings in C#

列表中找到。

0

我想你的意思

#pragma warning disable 
// generated code 
#pragma warning restore 

的「預警名單」是像「c0605,c0403,c3498」等MSDN文檔中的佔位符

相關問題