Reflection + Linq + DbSet

Dol*_*ita 4 linq reflection ef-code-first entity-framework-4.1

我使用EF代码优先4.1.在我的申请中.现在我想使用泛型类型通过WCF服务获取实体.我想反映泛型类型和调用方法ToListDbSet对象.这是我的代码:

 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>().

Die*_*hon 7

Eranga是正确的,但这是一个更容易的用法:

dynamic invokeSet = genericMethod.Invoke(mdc, null);
var list = Enumerable.ToList(invokeSet);
Run Code Online (Sandbox Code Playgroud)

C#4 dynamic为您处理繁琐的泛型反射.


Era*_*nga 5

ToLIst()不是 DbSet/ObjectSet 的成员,而是一个扩展方法。

你可以试试这个

var method = typeof(Enumerable).GetMethod("ToList");
var generic = method.MakeGenericMethod(genericType);
generic.Invoke(invokeSet, null);
Run Code Online (Sandbox Code Playgroud)

  • 一个小细节是 ToList 是一种静态扩展方法 - 因此必须像这样调用它: generic.Invoke(null, new [] { invokeSet });。这是因为静态方法不是从实例调用的 - 如果该方法是静态的,则 Invoke 的第一个参数将被忽略。此外,由于这是一个扩展方法,因此它的第一个参数必须是将要转换为列表的集合。 (2认同)