2016-06-23 79 views
1

我有一個單元測試,確保我的WebAPI控制器從右側基類型派生:的WebAPI控制器,名爲「<> C」

[TestMethod] 
public void AllWebApiControllersShouldDeriveFromApiController() 
{ 
    var controllers = Assembly.GetAssembly(typeof(ApiControllerBase)).GetTypes() 
     .Where(t => t.Namespace == "Xxx.Web.Controllers") 
     .ToList(); 

    controllers.Should().NotBeEmpty(); 

    foreach (var controller in controllers) 
    { 
     if (controller == typeof(ApiControllerBase)) continue; 

     controller.Should().BeDerivedFrom<ApiControllerBase>(); 
    } 
} 

它工作正常,直到最近,當列表中的所有突然的控制器開始出現兩個「鬼」控制器。他們看起來像某種通用(自動生成的?)類型,他們沒有通過我的測試。它們是:

名稱= 「<> C」 全名= 「Xxx.Web.Controllers.ExistingControllerNameController + <> C」

他們沒有我上面的測試。他們是什麼?哪兒來的呢?我怎樣才能擺脫它們?

N.B.測試在構建服務器上也失敗。清潔&重建沒有幫助。前

控制器代碼:

[HttpGet] 
[Route("api/things")] 
public IEnumerable<ThingDto> GetAll() 
{ 
    return service.GetAll(); 
} 

&後:

[HttpGet] 
[Route("api/things")] 
public IEnumerable<ThingDto> GetAll() 
{ 
    return service.GetAll().OrderBy(x => x.Description); 
} 
+0

檢查源控件中的更改。在不知道涉及哪些類的情況下無法提供幫助 –

+2

它們是由各種原因生成的編譯器生成的類。只需[在類型上添加對'CompilerGenerated'屬性的檢查](http://stackoverflow.com/questions/6418779)。 –

+0

@DStanley你是對的,但是,我想了解他們爲什麼突然開始出現? – Tsar

回答

0

按照建議的意見,拉姆達的OrderBy子句中引起了這些編譯器生成的類出現。我已包含CompilerGeneratedAttribute檢查以排除我的測試中的這些檢測:

[TestMethod] 
public void AllWebApiControllersShouldDeriveFromApiController() 
{ 
    var controllers = Assembly.GetAssembly(typeof(ApiControllerBase)).GetTypes() 
     .Where(t => t.Namespace == "Xxx.Web.Controllers" 
     && IsCompilerGenerated(t) == false).ToList(); 

    controllers.Should().NotBeEmpty(); 

    foreach (var controller in controllers) 
    { 
     if (controller == typeof(ApiControllerBase)) continue; 

     controller.Should().BeDerivedFrom<ApiControllerBase>(); 
    } 
} 

private static bool IsCompilerGenerated(MemberInfo t) 
{ 
    return Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute)) != null; 
} 
2

<>是不是在C#中的名稱合法的,那些是已經由編譯器生成的類名。

使您的Where子句更加嚴格,以排除編譯器生成的類型。

var controllers = Assembly.GetAssembly(typeof(ApiControllerBase)).GetTypes() 
     .Where(t => t.Namespace == "Xxx.Web.Controllers") 
     .Where(t => !t.Name.Contains("<>") 
     .ToList(); 
+0

您應該注意,名稱中使用'<>'是一個_implementation detail_,它可能會改變。不保證將來的編譯器使用該前綴。 –

+0

是的,你是對的。按照您的建議更好地檢查「CompilerGenerated」屬性。 –

相關問題