解决方案 »

  1.   

    方法前面加 virtual 关键字,子类里面就可以重载了,当然还是要用泛型 <T> 。
      

  2.   

    额 我打算用抽象方法来实现  那个都没问题 主要你能解释下泛型<T>的怎么使用吗  我写着总是说T不存在
      

  3.   

    这是父类  抽象类public abstract class EntityFactory
        {
            public abstract IQueryable<T> getCountries<T>();
            public abstract IQueryable<T> getProvinces<T>();
            public abstract IQueryable<T> getCities<T>();
            public abstract IQueryable<T> getBanks<T>();
            public abstract IQueryable<T> getCurrencyTypes<T>();
            public abstract IQueryable<T> getCredentialsTypes<T>();
            public abstract IQueryable<T> getCalls<T>();
            public virtual IQueryable<T> getDepositWaies<T>()
            {
                return null;
            }
            public virtual IQueryable<T> getPayeeBanks<T>()
            {
                return null;
            }
            public virtual IQueryable<T> getPayeeBankRelations<T>()
            {
                return null;
            }
        }
    这是子类  每次都需要显示传入类型T  怎么改能成我提问的那种  毋须显示声明类型/// <summary>
            /// 获取所有国家
            /// </summary>
            /// <returns></returns>
            public override IQueryable<JS_Country> getCountries<JS_Country>()
            {
                TBullionDbEntities db = new TBullionDbEntities();
                var q = from r in db.JS_Country
                        select r;
                return q as IQueryable<JS_Country>;
            }
      

  4.   


    public IQueryable<T> getList<T>()
    {
         return null;
    }
      

  5.   

    把T放在类中public abstract class EntityFactory<T>
    {
    public IQueryable<T> getList()
    {
         return null;
    }
    }
      

  6.   


    public static class bbb
        {
            public static IQueryable<T> getList<T>(this T obj)
            {
                return null;
            }
        }要么这样
      

  7.   

    访问的时候就MarshalAsAttribute a = new MarshalAsAttribute();
    IQueryable<MarshalAsAttribute> c = a.getList();
      

  8.   


    如果说像我上面给的例子那样  那每个方法调用都需要实例化  下面这样EntityFactory f=new TEFHelper(Model1);
    f.getModel1();EntityFactory f2 = new TEFHelper(Model2);
    f.getModel2();
    这样的貌似比之前那种还麻烦了
      

  9.   

    访问的时候就MarshalAsAttribute a = new MarshalAsAttribute();
    IQueryable<MarshalAsAttribute> c = a.getList();
    你这个方法初步看来符合我的要求  待我试试能否使用
      

  10.   

    访问的时候就MarshalAsAttribute a = new MarshalAsAttribute();
    IQueryable<MarshalAsAttribute> c = a.getList();
    额 发现你这个不行   我是用父类去实例化子类  你这个都静态的了  毋须实例化了  我怎么调用子类哦。。
      

  11.   

    额  调用的时候知道  但是我想打到一个目的   就是说同样的代码  两个子类中的实现不一样  所用的实体类也不一样  但是调用的代码是一样的   只需要通过父类实例化相应子类就OK了   所以说我需要用到工厂模式  实际上我这个问题就是一个工厂模式  只不过加了匿名类型进去了而已   在3L 有我的现有代码 你参考那个修改下是否能行
      

  12.   

    实际上做这个功能更多的是想真正去了解OOP  3大特性除了封装  基本没别的了   但是就这个问题而言   我感觉OOP应该很强大  不可能就是用来完成新手级别三层的需求的
      

  13.   

    那么能不能换一种实现方式,在父类里定义一个委托public delegate void GetL<T>(),子类初始化的时候实例化这个委托GetL<JS_Country> m1 = new GetL<JS_Country>(getList);,外部调用的时候直接调用委托m1();,你看这样行不
      

  14.   

    搜索一下
    Repository 模式
      

  15.   

    你可以每个成员单独约束(属性除外)
    按你的构想,你应该设计成泛型类(接口)
    public abstract class EntityFactory<T> where T :  EntityObject
    {
             public abstract IQueryable<T> getProvinces<T>();
            public abstract IQueryable<T> getCities<T>();
            public abstract IQueryable<T> getBanks<T>();
            public abstract IQueryable<T> getCurrencyTypes<T>();
            public abstract IQueryable<T> getCredentialsTypes<T>();
            public abstract IQueryable<T> getCalls<T>();
            public virtual IQueryable<T> getDepositWaies<T>()
            {
                return null;
            }
            public virtual IQueryable<T> getPayeeBanks<T>()
            {
                return null;
            }
            public virtual IQueryable<T> getPayeeBankRelations<T>()
            {
                return null;
            }
    }
      

  16.   

    但是linq语法  var q=from r in db.js_country select r;
    这种编译器就能推导出q的类型为iqueryable<js_country>  为什么我的不行呢
      

  17.   

    但是linq语法  var q=from r in db.js_country select r;
    这种编译器就能推导出q的类型为iqueryable<js_country>  为什么我的不行呢
    我说的做不到是指,你没有办法将匿名类型作为函数的返回值。
      

  18.   


    我为什么想到用这种方式去实现  就是因为看到linq的那种写法  很方便  但是我看封装的程序集只有一个声明  所以还是不清楚到底怎么样才能实现类似于linq的写法  ,但是你也看到了  我上面这个功能确实很需要这个匿名类型  如果没有它  这个功能要大打折扣的
      

  19.   

    但是linq语法  var q=from r in db.js_country select r;
    这种编译器就能推导出q的类型为iqueryable<js_country>  为什么我的不行呢
    我说的做不到是指,你没有办法将匿名类型作为函数的返回值。即是说,我这个问题解决不了了吗   
      

  20.   

    但是linq语法  var q=from r in db.js_country select r;
    这种编译器就能推导出q的类型为iqueryable<js_country>  为什么我的不行呢
    我说的做不到是指,你没有办法将匿名类型作为函数的返回值。即是说,我这个问题解决不了了吗   从语法的角度解决不了,不等于说你写不出程序。一个是,你需要人工定义那些本来作为匿名类型的类型。另一个是,你可以返回List<object>,在主程序中用dynamic类型接收(C# 4.0+这样最简单),或者用object类型接收并且反射。还有就是将Select的过程交给调用者自己做,用委托传入,这样绕开了返回一个匿名类型这个问题了。
      

  21.   

    OK  这个地方采用BZ的”在主程序中用dynamic类型接收(C# 4.0+这样最简单)“ 这种解决了问题
    不过有个不好的地方就是无法使用VS的自动提示功能呢了 因为是动态的  得在运行时再解析  不过也算完美解决了
      

  22.   

    因为类型是从db.js_country确定的,而你的        public override IQueryable<JS_Country> getCountries<JS_Country>()
            {
                TBullionDbEntities db = new TBullionDbEntities();
                var q = from r in db.JS_Country
                        select r;
                return q as IQueryable<JS_Country>;
            }没有任何参数,类型是凭空冒出来的,如果你写成这样也是可以确定类型的        public override IQueryable<JS_Country> getCountries<JS_Country>(IQueryable<JS_Country> query)
            {
                var q = from r in query
                        select r;
                return q as IQueryable<JS_Country>;
            }
    XXX.getCountries(new TBullionDbEntities().JS_Country);