Я создаю ExpressionConverter, который позволяет мне преобразовывать выражения типа
Expression<Func<A1, B1, C1, ..., Z1>>
к выражениям типа Expression<Func<A2, B2, C2, ..., Z2>>
У меня есть существующая карта, которая отображает тип A1
на тип A2
, B1
на B2
, C1
на C2
и так далее.
Так что простая карта работает легко.
private Type GetMappingType(Type type)
{
var types = _mappingFinder.FindTypesFor(type).ToArray();
if (types.Length == 0)
{
if (type.IsNested)
{
var nestedTypes = type.GetNestedTypes();
var mappedNestedTypes = nestedTypes.Select(this.GetMappingType).ToArray();
//TODO: return the nested type
}
if (type.HasElementType)
{
var mappedElementType = this.GetMappingType(type.GetElementType());
//TODO: return the right container type with the mappedElementType
}
if (type.IsGenericType)
{
var genericTypes = type.GetGenericArguments();
var mappedGenericTypes = genericTypes.Select(this.GetMappingType).ToArray();
//TODO: return generictype with the mappedGenericTypes as arguments
}
return type;
}
if (types.Length == 1)
return _types.Contains(types[0]) ? type : types[0];
throw new Exception("Too many mapped types for " + type);
}
проблемные случаи отмечены //TODO
Поскольку я только напрямую сопоставляю A1
с A2
, мне нужно динамически создавать такие типы массивов, как A2[]
, когда я вижу A1[]
(общий случай: Func<A1>
до Func<A2>
, ...)
Кто-нибудь может указать мне правильное направление / документацию?