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

标签 c# .net generics

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

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

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

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/

相关文章:

c# - 在 C# 中为 dataGridView 单元格提供背景图像

c# - 从扩展方法中获取调用方方法

.net - 如何调试: Multiple assemblies with equivalent identity have been imported?

Swift 3 泛型 : issue with setting UICollectionViewDatasource & Delegate for a UICollectionView inside UITableViewCell

c# - 在任何页面上显示消息的一般方法

c# - NUnit CollectionConstraints 异常

c# - 在 Visual Studio 中调试第三方 DLL?

java - 覆盖具有不同签名的方法

java - 对返回语句中未经检查的强制转换发出警告

c# - Angular 7 与 SignalR Hub 的连接失败