Dol*_*ita 4 linq reflection ef-code-first entity-framework-4.1
我使用EF代码优先4.1.在我的申请中.现在我想使用泛型类型通过WCF服务获取实体.我想反映泛型类型和调用方法ToList的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;
}
}
Run Code Online (Sandbox Code Playgroud)
事实上,然后我写代码return mdc.Set<SomeRealCrmObject>().ToList()- 对我来说工作正常!但后来我使用泛型类型我找不到对象中的ToList方法DbSet<SomeRealCrmObject>().
Eranga是正确的,但这是一个更容易的用法:
dynamic invokeSet = genericMethod.Invoke(mdc, null);
var list = Enumerable.ToList(invokeSet);
Run Code Online (Sandbox Code Playgroud)
C#4 dynamic为您处理繁琐的泛型反射.
ToLIst()不是 DbSet/ObjectSet 的成员,而是一个扩展方法。
你可以试试这个
var method = typeof(Enumerable).GetMethod("ToList");
var generic = method.MakeGenericMethod(genericType);
generic.Invoke(invokeSet, null);
Run Code Online (Sandbox Code Playgroud)