如何过滤掉<>;通过反射遍历类型时的c_DisplayClass类型
本文关键字:类型 遍历 反射 DisplayClass 何过滤 过滤 gt lt | 更新日期: 2023-09-27 18:00:41
我正在尝试创建一个单元测试,以确保我的所有业务类(我称之为命令和查询类)都可以用Windsor解决。我有以下单元测试:
[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查询中的名称的情况下筛选出这些类型?
我会检查系统的每个类型。运行时。编译器服务。CompilerGeneratedAttribute。
您可以使用"类型"。IsDefined,所以代码看起来像这样:
foreach (Type type in classTypes)
{
if (type.IsDefined (typeof (CompilerGeneratedAttribute), false))
continue;
// use type...
}
[CompilerGenerated]
属性。
我想出了这个简单的方法来处理这种情况。
bool IsCompilerGenerated(Type t) {
if (t == null)
return false;
return t.IsDefined(typeof(CompilerGeneratedAttribute), false)
|| IsCompilerGenerated(t.DeclaringType);
}
表现出这种行为的类看起来是这样的:
class SomeClass {
void CreatesADisplayClass() {
var message = "foo";
Action outputFunc = () => Trace.Write(message);
Action wheelsWithinWheels = () =>
{
var other = "bar";
Action wheel = () => Trace.WriteLine(message + " " + other);
};
}
}
检查是否存在[CompilerGenerated]
属性。