我首先使用EF代码4.1。在我的申请中。现在,我想使用泛型类型通过WCF服务获取实体。我正在尝试反映泛型类型并调用DbSet对象的ToList方法。这是我的代码:
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()
一样——对我来说很好!但随后我使用了在对象DbSet<SomeRealCrmObject>()
中找不到ToList方法的泛型类型。
Eranga是正确的,但这是一个更容易的用法:
dynamic invokeSet = genericMethod.Invoke(mdc, null);
var list = Enumerable.ToList(invokeSet);
C#4的dynamic
为您处理繁琐的泛型反射。
ToLIst()不是DbSet/ObjectSet的成员,而是一个扩展方法。
你可以试试这个代替
var method = typeof(Enumerable).GetMethod("ToList");
var generic = method.MakeGenericMethod(genericType);
generic.Invoke(invokeSet, null);
我也遇到过类似的情况,我需要一种方法来动态加载页面上用于搜索条件的下拉列表的值,允许用户对给定的表运行即席查询。我想动态地这样做,这样当添加新字段时,前端或后端就不会发生代码更改。因此,使用动态类型和一些基本反射,它解决了我的问题。
我需要做的是基于DbSet的泛型类型在DbContext上调用DbSet属性。例如,类型可能被称为County,DbSet属性被称为Countrys。下面的load方法将加载类型为T(郡)的对象,并通过调用名为Counties的DbSet属性返回一个T对象数组(郡对象列表)。EntityList只是一个decorator对象,它接受一个查找项列表,并添加前端网格所需的其他属性。
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;
}