db.sd.Where("it.fr>0").Take(1).Single();是可以正确执行的
现在怎样用反射的方法执行Single()方法?            var db = new Entities1()
            object sd = db.sd;.....            if (db != null)
            {
                MethodInfo miWhere = db.PropertyType.GetMethod("Where", BindingFlags.Public | BindingFlags.Instance);  //能正确反射出Where
                if (miWhere != null)  //Where方法不为空继续反射Take,Single
                {
                    var wh = miWhere.Invoke(sd, new object[] { "it.fr>0", new System.Data.Objects.ObjectParameter[] { } }); //Where("it.fr>0")
                    下面如何反射出Take(1).Single()方法?
                }
            }

解决方案 »

  1.   

    linq??
    反射,这个不会,顶一下 
      

  2.   

    等待C#高手,看看怎么反射Where("it.fr>0").Take(1).Single();方法
      

  3.   

    Take和Single应该是是LINQ的扩展方法吧,它们并没有被定义在实体类型上,而是在System.Linq命名空间下面的Enumerable或Queryable。所以应该用:
    var takeMethod = typeof(System.Linq.Queryable).GetMethod("Take", ...);
    因为可能会有多种重载,所以应该设置一些参数来返回你要的那个。
      

  4.   

    MethodInfo miWhere = db.PropertyType.GetMethod("Where", BindingFlags.Public | BindingFlags.Instance); //能正确反射出Where
      if (miWhere != null) //Where方法不为空继续反射Take,Single
      {
      var wh = miWhere.Invoke(sd, new object[] { "it.fr>0", new System.Data.Objects.ObjectParameter[] { } }); //执行Where
      var takeMethod = typeof(System.Linq.Queryable).GetMethod("Take"); //获取Take
      wh.TakeMethod.Invoke(              =>想调用sd.Where("it.fr>0").Take方法,结果发现没有Invoke这个方法,要怎么写才对?
      

  5.   

    上面最后一行打错了,改成
    var takeMethod = typeof(System.Linq.Queryable).GetMethod("Take");  =>获取Take方法
    var takeValue=takeMethod.Invoke(wh, new object[] { 0 });           =>执行Take方法
    报错:不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作
      

  6.   

    不好意思,忘记它是泛型方法了,GetMethod返回的值是泛型方法的定义,不能直接执行,要转换一下。var takeMethod = typeof(System.Linq.Queryable).GetMethod("Take").MakeGenericMethod(typeof(实体类型));
      

  7.   

    现在Take方法可以了,但Single方法还是没办法var takeMethod = typeof(System.Linq.Queryable).GetMethod("Take").MakeGenericMethod(typeof(sd实体类型));
                        var takeValue = takeMethod.Invoke(wh, new object[] { sd, 0 });                    var singleMethod = typeof(System.Linq.Queryable).GetMethod("Single",new Type[0]);==>这里一真为NULL,要怎么修改才正确 调用Single方法
                        var singleValue = singleMethod.Invoke(takeValue, null);
      

  8.   

    effun
      帮我看一下啊,还有最后一个Single()没有反射成功
      

  9.   

    试了好久Single方法不知道要怎么反射
      

  10.   

    Single有2个重载,你需要的是只有1个参数的那个重载,这样的话可以把所有的方法都取出来,再找到符合条件的那一个Single方法就行了。typeof(Queryable).GetMethods().Single(m => m.Name == "Single" && m.GetParameters().Length == 2)