在运行时构建嵌套,泛型和数组类型

时间:2012-01-18 16:03:41

标签: c# reflection expression

我正在构建一个ExpressionConverter,它允许我转换类型为

的表达式

Expression<Func<A1, B1, C1, ..., Z1>>Expression<Func<A2, B2, C2, ..., Z2>>

类型的表达式

我有一个现有的地图,将A1类型映射到A2B1B2C1C2,依此类推。 所以简单的地图工作很容易。

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 个答案:

答案 0 :(得分:1)

对于数组: mappedElementType.MakeArrayType();

对于泛型: return type.GetGenericTypeDefinition().MakeGenericType(mappedGenericTypes);

但我错过了嵌套类型的观点,很可能是因为我自己从未遇到过这个问题。