我正在构建一个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>
,...)
谁能指出我正确的方向/文件?
答案 0 :(得分:1)
对于数组:
mappedElementType.MakeArrayType();
对于泛型:
return type.GetGenericTypeDefinition().MakeGenericType(mappedGenericTypes);
但我错过了嵌套类型的观点,很可能是因为我自己从未遇到过这个问题。