我想創建一個單元測試,確保我的所有業務類(我稱之爲命令和查詢類)都可以與Windsor一起解決。我有以下的單元測試:如何通過反射過濾類型時過濾<> c_DisplayClass類型?
[TestMethod]
public void Windsor_Can_Resolve_All_Command_And_Query_Classes()
{
// Setup
Assembly asm = Assembly.GetAssembly(typeof(IUnitOfWork));
IList<Type> classTypes = asm.GetTypes()
.Where(x => x.Namespace.StartsWith("MyApp.DomainModel.Commands") || x.Namespace.StartsWith("MyApp.DomainModel.Queries"))
.Where(x => x.IsClass)
.ToList();
IWindsorContainer container = new WindsorContainer();
container.Kernel.ComponentModelBuilder.AddContributor(new SingletonLifestyleEqualizer());
container.Install(FromAssembly.Containing<HomeController>());
// Act
foreach (Type t in classTypes)
{
container.Resolve(t);
}
}
這失敗,出現以下異常:
No component for supporting the service MyApp.DomainModel.Queries.Organizations.OrganizationByRegistrationTokenQuery+<>c__DisplayClass0 was found
我明白<>c__DisplayClass0
類型是由於LINQ的被編譯,但我怎麼能過濾掉這些類型沒有硬編碼我的Linq查詢中的名稱?
你可以使用'type.IsDefined'使生活變得更簡單。 –
@Jon,謝謝!我必須記住IsDefined ...更簡潔! –
使用運行良好的反射代碼可以打破自VS2015!我有一個代碼從MethodCall返回正確的表達式('List')。現在它返回一個'<> c__DisplayClass36_0).CS $ <> 8__locals1'。請注意,這是一個'MemberExpression'(它是一個'ConstantExpression',包含列表作爲值))。現在我必須遵循這個額外的間接尋址方式,然後獲得'CS $ <> 8_locals1'的字段值,以便獲得我的列表。 –