无反射的编译时泛型类型映射

本文关键字:泛型类型 映射 编译 反射的 | 更新日期: 2023-09-27 18:25:21

在C#中,有没有办法在编译时将一种泛型类型映射到另一种泛型?我想避免在这个问题上使用"反射"。例如,假设我希望TypeA映射到TypeB,并具有类似于以下代码工作的内容:

private void List<U> GetItemList<T>() where T : class <== U is the destination type obtained by the compile-time mapping from T to U
{
    Type U = GetMappedType(typeof(T))   <=== this needs to happen during compile-time
    List<U> returnList = Session.QueryOver<U>().List();
    return returnList;
}
private Type GetMappedType(Type sourceType)
{
    if (sourceType == typeof(TypeA))
        return typeof(TypeB);
}

我意识到,由于我使用方法调用来映射类型,它不会在编译时进行映射,但是否有其他方法可以实现我试图实现的目标,只在编译时实现?我知道上面的代码不正确,但我希望你能看到我想要的。

简而言之,我想知道是否有一种方法可以将一种类型映射到另一种类型,并让C#编译器知道类型映射,以便将目标类型用作任何采用泛型类型参数的方法的泛型类型参数。我希望避免使用"反射"

作为一个附带问题,如果我真的为此使用反射,它会使实现变得资源非常繁重吗?

无反射的编译时泛型类型映射

答案是动态的。我最近遇到了同样的问题,我必须根据数据库中配置的一些值切换存储库。

var tableNameWithoutSchema = tableName.Substring(tableName.IndexOf(".", StringComparison.Ordinal) + 1);
var tableType = string.Format("Library.Namespace.{0}, Library.Name", tableNameWithoutSchema);
var instance = UnitofWork.CreateRepository(tableType, uoW);

CreateRepository返回一个动态类型

public static dynamic CreateRepository(string targetType, DbContext context)
{
    Type genericType = typeof(Repository<>).MakeGenericType(Type.GetType(targetType));
    var instance = Activator.CreateInstance(genericType, new object[] { context });
    return instance;
}

上下文是必需的,因为我必须通过构造函数将上下文传递到Generic存储库。不过,就我而言,这种方法存在一些问题。也许这对你有帮助。