首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射+ Linq + DbSet

反射+ Linq + DbSet
EN

Stack Overflow用户
提问于 2011-06-06 13:50:39
回答 3查看 4.1K关注 0票数 4

我使用EF代码-第一个4.1。在我的申请中。现在,我希望使用泛型类型通过WCF服务获取实体。我试图反映泛型类型,并调用方法ToList of DbSet对象。这是我的代码:

代码语言:javascript
复制
 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>()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-06 14:09:41

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

你可以试试这个

代码语言:javascript
复制
var method = typeof(Enumerable).GetMethod("ToList");
var generic = method.MakeGenericMethod(genericType);
generic.Invoke(invokeSet, null);
票数 5
EN

Stack Overflow用户

发布于 2011-06-06 21:40:38

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

代码语言:javascript
复制
dynamic invokeSet = genericMethod.Invoke(mdc, null);
var list = Enumerable.ToList(invokeSet);

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

票数 8
EN

Stack Overflow用户

发布于 2016-06-09 18:39:50

我也遇到过类似的情况,我需要一种方法来动态加载页面上用于搜索条件的下拉列表的值,允许用户对给定的表运行临时查询。我希望动态地这样做,以便在添加新字段时,前端或后端不会发生代码更改。因此,使用动态类型和一些基本的反射,它解决了我的问题。

我需要做的是根据DbSet的泛型在DbContext上调用DbSet属性。因此,例如,类型可能被称为县,而DbSet属性被称为县。下面的load方法将加载类型为T的对象(县),并通过调用称为County的DbSet属性返回一个T对象数组(县对象列表)。EntityList只是一个装饰对象,它接收查找项的列表,并在前端添加网格所需的其他属性。

代码语言:javascript
复制
    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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6253017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档