我使用EF代码-第一个4.1。在我的申请中。现在,我希望使用泛型类型通过WCF服务获取实体。我试图反映泛型类型,并调用方法ToList of DbSet对象。这是我的代码:
public string GetAllEntries(string objectType)
{
try
{
var mdc =
Globals.DbConnection.Create(@"some_db_connection", true);
// Getting assembly for types
var asob = Assembly.GetAssembly(typeof(CrmObject));
// getting requested object type from assembly
var genericType = asob.GetType(objectType, true, true);
if (genericType.BaseType == typeof(CrmObject))
{
// Getting Set<T> method
var method = mdc.GetType().GetMember("Set").Cast<MethodInfo>().Where(x => x.IsGenericMethodDefinition).FirstOrDefault();
// Making Set<SomeRealCrmObject>() method
var genericMethod = method.MakeGenericMethod(genericType);
// invoking Setmethod into invokeSet
var invokeSet = genericMethod.Invoke(mdc, null);
// invoking ToList method from Set<> invokeSet
var invokeToList = invokeSet.GetType().GetMember("ToList").Cast<MethodInfo>().FirstOrDefault();
//this return not referenced object as result
return invokeToList.ToString();
}
return null;
}
catch (Exception ex)
{
return ex.Message + Environment.NewLine + ex.StackTrace;
}
}实际上,我编写的代码就像return mdc.Set<SomeRealCrmObject>().ToList() --对我来说很好!但是,我使用的是泛型类型,在对象ToList中找不到方法DbSet<SomeRealCrmObject>()。
发布于 2011-06-06 14:09:41
ToLIst()不是DbSet/ObjectSet的成员,而是一种扩展方法。
你可以试试这个
var method = typeof(Enumerable).GetMethod("ToList");
var generic = method.MakeGenericMethod(genericType);
generic.Invoke(invokeSet, null);发布于 2011-06-06 21:40:38
Eranga是正确的,但这是一个更容易使用的用法:
dynamic invokeSet = genericMethod.Invoke(mdc, null);
var list = Enumerable.ToList(invokeSet);C# 4的dynamic为您处理繁琐的泛型反射。
发布于 2016-06-09 18:39:50
我也遇到过类似的情况,我需要一种方法来动态加载页面上用于搜索条件的下拉列表的值,允许用户对给定的表运行临时查询。我希望动态地这样做,以便在添加新字段时,前端或后端不会发生代码更改。因此,使用动态类型和一些基本的反射,它解决了我的问题。
我需要做的是根据DbSet的泛型在DbContext上调用DbSet属性。因此,例如,类型可能被称为县,而DbSet属性被称为县。下面的load方法将加载类型为T的对象(县),并通过调用称为County的DbSet属性返回一个T对象数组(县对象列表)。EntityList只是一个装饰对象,它接收查找项的列表,并在前端添加网格所需的其他属性。
public T[] Load<T>() where T : class
{
var dbProperty = typeof(Data.BmpDB).GetProperties().FirstOrDefault(
x => x.GetMethod.ReturnType.GenericTypeArguments[0].FullName == typeof(T).FullName);
if (dbProperty == null)
return null;
dynamic data = dbProperty.GetMethod.Invoke(BmpDb, null);
var list = Enumerable.ToList(data) as List<T>;
var entityList = new Data.EntityList<T>(list);
return entityList.Results;
}https://stackoverflow.com/questions/6253017
复制相似问题