我目前正在研究泛型,我正在尝试编写一个函数,我可以调用它来通过指定表名从数据库表中加载所有内容。
我大部分时间都在那里;我的通用方法似乎都有效,但我不太确定如何将我的结果转化为可用的东西。
到目前为止,这是该方法的核心内容:
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/