Tôi đang cố tạo một bài kiểm tra đơn vị đảm bảo tất cả các lớp nghiệp vụ của tôi (tôi gọi chúng là các lớp lệnh và truy vấn) có thể được giải quyết bằng Windsor. Tôi có thử nghiệm đơn vị sau đây:Làm cách nào để lọc ra các loại <> c_DisplayClass khi đi qua các loại thông qua phản ánh?
[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);
}
}
này không thành công với những ngoại lệ sau đây:
No component for supporting the service MyApp.DomainModel.Queries.Organizations.OrganizationByRegistrationTokenQuery+<>c__DisplayClass0 was found
Tôi hiểu rằng <>c__DisplayClass0
loại là do LINQ được biên soạn, nhưng làm thế nào tôi có thể lọc ra những loại mà không hardcoding tên trong truy vấn LINQ của tôi?
Bạn có thể sử dụng 'type.IsDefined' để làm cho cuộc sống đơn giản hơn một chút. –
@Jon, Cảm ơn! Tôi sẽ phải nhớ IsDefined ... Nhiều gọn gàng hơn! –
Mã sử dụng Phản ánh đang chạy tốt có thể bị hỏng vì VS2015! Tôi có mã đã trả về biểu thức đúng (một 'Danh sách') từ một MethodCall. Bây giờ nó đang trả về một '<> c__DisplayClass36_0) .CS $ <> 8__locals1'. Lưu ý rằng đây là một 'MemberExpression' (nó là một' ConstantExpression' chứa danh sách là giá trị)). Bây giờ tôi phải làm theo hướng dẫn bổ sung này và sau đó lấy giá trị của một trường 'CS $ <> 8__locals1' để lấy danh sách của tôi. –