反射+林克+数据库集



我首先使用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;
    }

相关内容

  • 没有找到相关文章

最新更新