Определить, реализует ли универсальный класс тип

#c# #generics #reflection #fluent-nhibernate #sharp-architecture

#c# #общие #отражение #свободно-nhibernate #четкая архитектура

Вопрос:

Я работаю над проектом с четкой архитектурой, в котором сочетаются плавные сопоставления и автоматические сопоставления. В базовом проекте с четкой архитектурой уже есть метод (AutoMappingConfiguration.ShouldMap), который определяет, должен ли тип автоматически отображаться или нет. Мой в настоящее время выглядит следующим образом:

     public override bool ShouldMap(System.Type type)
    {
        if (type == typeof(ActiveUser))
            return false;

        return type.GetInterfaces().Any(x =>
             x.IsGenericType amp;amp; x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>));
    }
  

По сути, тип ActiveUser сопоставляется с использованием fluent mapping, а все остальное сопоставляется с использованием auto mapping, за исключением, конечно, общих базовых классов. Я нахожусь на том этапе, когда я буду добавлять более свободно отображаемые классы и действительно не хочу продолжать добавлять операторы if к этому методу, чтобы исключить их. Мне в основном нужен метод

 bool ShouldMap(System.Type type)
  

чтобы вернуть true, если универсальный класс

 ClassMap<type> 
  

существует.

Есть предложения?

Ответ №1:

Вы можете создать универсальный тип, используя Type.MakeGenericType, поэтому предполагая, что у вас есть сборка, которая содержит все сопоставления, которые вы можете выполнить:

 public bool ShouldMap(Assembly mappingAssembly, Type type)
{
    Type classMapType = typeof(ClassMap<>).MakeGenericType(type);
    return mappingAssembly.GetTypes().Any(t => t.IsSubclassOf(classMapType));
}
  

Ответ №2:

рассматривали ли вы возможность отображения ВСЕХ классов, но с использованием переопределения*отображения * для классов, которые вы хотите отобразить явно (вместо обычного fluent mapping)?