gpt4 book ai didi

c# - 没有反射的编译时通用类型映射

转载 作者:行者123 更新时间:2023-12-04 14:36:29 24 4
gpt4 key购买 nike

在 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;
}

需要上下文,因为我必须通过构造函数将上下文传递给通用存储库。就我而言,这种方法有一些问题。也许这对您有帮助。

关于c# - 没有反射的编译时通用类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17915028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com