5

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

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

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

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

1 回答 1

5

假设SpecificEntity.LoadAll返回从 派生的某种类型的列表EntityCodeBase,您不能直接转换为 aList<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,则不能将 aList<TDerived>转换为 a IEnumerable<TBase>,因此您必须先转换为IEnumerable

return ((System.Collections.IEnumerable)mi.Invoke(null, null))
    .Cast<EntityCodeBase>()
    .ToList();
于 2013-02-06T21:44:24.960 回答