为什么我的课没有通过反射被接走

本文关键字:反射 我的 为什么 | 更新日期: 2023-09-27 18:06:54

我正在尝试创建一个单元测试来验证我加载AutoMapper配置的方法是否正确工作。我加载AutoMapper配置的想法是将配置调用放在具有以下接口的类中:

public interface IEntityMapConfiguration
{
    void ConfigureMapping();
}
为了动态加载这些文件,我使用以下加载器类
public class EntityMapLoader
{
    public static void LoadEntityMappings()
    {
        // Load all IEntityMapConfiguration classes via reflection
        var types = AppDomain.CurrentDomain
                             .GetAssemblies()
                             .SelectMany(x => x.GetTypes())
                             .Where(x => x.IsSubclassOf(typeof(IEntityMapConfiguration)))
                             .Select(x => x as IEntityMapConfiguration)
                             .ToList();
        foreach (var config in types)
            config.ConfigureMapping();
    }
}
为了验证这一点,我创建了以下单元测试
public class UnitTestEntityViewModel
{
    public int Id { get; set; }
    public int Text2 { get; set; }
}
public class TestProjectionMapping : IEntityMapConfiguration
{
    public void ConfigureMapping()
    {
        Mapper.CreateMap<UnitTestEntity, UnitTestEntityViewModel>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.Text2, opt => opt.MapFrom(src => src.Text));
    }
}
[TestClass]
public class AutomapperConfigurationTests
{
    [TestMethod]
    public void Loader_Loads_All_Configurations_In_Assembly()
    {
        // Setup
        UnitTestEntity entity = new UnitTestEntity { Id = 2, Text = "Test 1234" };
        // Act
        EntityMapLoader.LoadEntityMappings();
        // Verify
        UnitTestEntityViewModel result = Mapper.Map<UnitTestEntity, UnitTestEntityViewModel>(entity);
        Assert.AreEqual(entity.Id, result.Id, "View model's ID value did not match");
        Assert.AreEqual(entity.Text, result.Text2, "View model's text value did not match");
    }
}

问题是这个单元测试失败了,因为它没有拾取我的TestProjectionMapping类,我不知道为什么。在我的LoadEntityMappings()中,types列表计数为零。我已经验证了我的测试组件是从AppDomain.CurrentDomain.GetAssemblies()返回的。

我肯定我做了一些明显的错误,但我找不到它。什么好主意吗?


Edit:我将LoadentityMappings()方法更新为:

    public static void LoadEntityMappings()
    {
        // Load all IEntityMapConfiguration classes via reflection
        var types = AppDomain.CurrentDomain
                             .GetAssemblies()
                             .SelectMany(x => x.GetTypes())
                             .Where(x => x.GetInterfaces().Contains(typeof(IEntityMapConfiguration)))
                             .Select(x => x as IEntityMapConfiguration)
                             .ToList();
        foreach (var config in types)
            config.ConfigureMapping();
    }

仍然失败。语句(没有最后的选择)返回我的TestProjectionMapping类,但x as IEntityMapconfiguration失败。在调试器中,当我输入(IEntityMapConfiguration)types[0]时,我得到以下错误:

Cannot cast 'types[0]' (which has an actual type of 'System.RuntimeType') to 'MyJobLeads.DomainModel.EntityMapping.IEntityMapConfiguration'

参考观察列表输入types[0]显示:

types[0] {Name = "TestProjectionMapping" FullName = "MyJobLeads.Tests.TestProjectionMapping"} System.Type {System.RuntimeType}

同样,types[0] is IEntityMapConfigurationfalse

我不知道为什么我不能出演这个角色,有什么想法吗?

为什么我的课没有通过反射被接走

您不能使用Type.IsSubclassOf来查看类型是否实现了接口。你必须使用Type.IsAssignableFrom(或者你可以使用is IEntityMapConfigurationType.GetInterfaces,然后看看结果序列是否包含typeof(IEntityMapConfiguration)

现在想想为什么不能使用Type.IsSubclassOf来查看Type是否实现了一个接口。因为我们不会说实现一个接口的类是那个接口的子类;相反,我们说它实现了接口,并将保留为的子类(除非指定了objectValueType)。

顺便说一下,这是,在Type.IsSubclassOf的文档中清楚地说明了:

IsSubclassOf方法不能用于确定一个接口是否从另一个接口派生,或者一个类是否实现了一个接口。

Use IsAssignableFrom()

来自MSDN:

IsSubclassOf方法不能用于确定一个接口是否从另一个接口派生,或者一个类是否实现了一个接口。