gpt4 book ai didi

c# - 从通用方法调用中转换结果?

转载 作者:太空狗 更新时间:2023-10-29 23:16:06 26 4
gpt4 key购买 nike

我目前正在研究泛型,我正在尝试编写一个函数,我可以调用它来通过指定表名从数据库表中加载所有内容。

我大部分时间都在那里;我的通用方法似乎都有效,但我不太确定如何将我的结果转化为可用的东西。

到目前为止,这是该方法的核心内容:

private static List<EntityCodeBase> GetCodeLoadResults(CodeTables table)
{
List<EntityCodeBase> results = new List<EntityCodeBase>();
Assembly assm = Assembly.Load(new System.Reflection.AssemblyName("RR"));
Type tableType = assm.GetTypes().Where(u => u.Name.ToLower() == table.ToString().ToLower()).FirstOrDefault();
MethodInfo mi = typeof(SpecificEntity).GetMethod("LoadAll");

mi = mi.MakeGenericMethod(tableType);
mi.Invoke(null, null); //how can I cast the resulting object into a List<EntityCodeBase> ?

return results;
}

最佳答案

假设SpecificEntity.LoadAll返回从 EntityCodeBase 派生的某种类型的列表, 你不能直接转换到 List<EntityCodeBase>但你可以转换为 IEnumerable<EntityCodeBase> .然后你可以创建一个新列表:

var ecbList = (IEnumerable<EntityCodeBase>)mi.Invoke(null, null);
return list.ToList();

但是,如果您可以直接通过名称、使用属性或使用映射从实体类型中获取表名,则可能会更简洁。然后你可以制作GetCodeLoadResults结果类型中的泛型,例如

private static List<T> GetCodeLoadResults() where T : EntityCodeBase
{
Assembly assm = Assembly.Load(new System.Reflection.AssemblyName("RR"));
Type tableType = //get table type from T
MethodInfo mi = typeof(SpecificEntity).GetMethod("LoadAll");

mi = mi.MakeGenericMethod(tableType);
return (List<T>)mi.Invoke(null, null);
}

如果您不使用 .Net 4,则无法转换 List<TDerived>IEnumerable<TBase> , 所以你必须转换到 IEnumerable第一:

return ((System.Collections.IEnumerable)mi.Invoke(null, null))
.Cast<EntityCodeBase>()
.ToList();

关于c# - 从通用方法调用中转换结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739216/

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