Создание вложенных, универсальных и массивных типов во время выполнения - PullRequest
0 голосов
/ 18 января 2012

Я создаю 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>, ...) Кто-нибудь может указать мне правильное направление / документацию?

1 Ответ

1 голос
/ 18 января 2012

Для массива: mappedElementType.MakeArrayType();

Для генериков: return type.GetGenericTypeDefinition().MakeGenericType(mappedGenericTypes);

Но я упустил момент для вложенных типов, скорее всего потому, что сам никогда не сталкивался с проблемой.

...