匿名泛型集合的重写

oLanJieKou 2014-04-21 02:42:52
自己在弄一个想实现工厂模式的程序 我这个代码需要使用到匿名类型的泛型 所以不知道该怎么做 上代码 大家看看

public IQueryable<T> getList()
{
//...
}


上面的T是一个匿名类型 这是我想要在子类里重写的方法结构 那如何在父类(抽象类)里去写一个合适的让子类实现呢 这个匿名类型好烦
...全文
441 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2014-04-22
  • 打赏
  • 举报
回复
引用 22 楼 oLanJieKou 的回复:
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
因为类型是从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);
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
OK 这个地方采用BZ的”在主程序中用dynamic类型接收(C# 4.0+这样最简单)“ 这种解决了问题 不过有个不好的地方就是无法使用VS的自动提示功能呢了 因为是动态的 得在运行时再解析 不过也算完美解决了
threenewbee 2014-04-21
  • 打赏
  • 举报
回复
引用 25 楼 oLanJieKou 的回复:
[quote=引用 23 楼 caozhy 的回复:] [quote=引用 22 楼 oLanJieKou 的回复:] [quote=引用 19 楼 caozhy 的回复:] 可以很确定地告诉你,在语法层面做不到。
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢[/quote] 我说的做不到是指,你没有办法将匿名类型作为函数的返回值。[/quote] 即是说,我这个问题解决不了了吗 [/quote] 从语法的角度解决不了,不等于说你写不出程序。 一个是,你需要人工定义那些本来作为匿名类型的类型。另一个是,你可以返回List<object>,在主程序中用dynamic类型接收(C# 4.0+这样最简单),或者用object类型接收并且反射。还有就是将Select的过程交给调用者自己做,用委托传入,这样绕开了返回一个匿名类型这个问题了。
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 18 楼 xdashewan 的回复:
[quote=引用 16 楼 oLanJieKou 的回复:] [quote=引用 15 楼 xdashewan 的回复:] 那么能不能换一种实现方式,在父类里定义一个委托public delegate void GetL<T>(),子类初始化的时候实例化这个委托GetL<JS_Country> m1 = new GetL<JS_Country>(getList);,外部调用的时候直接调用委托m1();,你看这样行不
我的理解委托是用来处理事件传递更方便吧 我没有在除了事件处理之外的地方使用过委托 我也不清楚 [/quote] 我是说这样是不是符合你的设计模式[/quote] 这个还牵扯不到设计模式吧 况且我还不懂啥设计模式。
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 23 楼 caozhy 的回复:
[quote=引用 22 楼 oLanJieKou 的回复:] [quote=引用 19 楼 caozhy 的回复:] 可以很确定地告诉你,在语法层面做不到。
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢[/quote] 我说的做不到是指,你没有办法将匿名类型作为函数的返回值。[/quote] 即是说,我这个问题解决不了了吗
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 21 楼 dongxinxi 的回复:
你要用工厂模式最好就撇开匿名类型(委托),匿名类型和泛型完全是两回事
我为什么想到用这种方式去实现 就是因为看到linq的那种写法 很方便 但是我看封装的程序集只有一个声明 所以还是不清楚到底怎么样才能实现类似于linq的写法 ,但是你也看到了 我上面这个功能确实很需要这个匿名类型 如果没有它 这个功能要大打折扣的
threenewbee 2014-04-21
  • 打赏
  • 举报
回复
引用 22 楼 oLanJieKou 的回复:
[quote=引用 19 楼 caozhy 的回复:] 可以很确定地告诉你,在语法层面做不到。
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢[/quote] 我说的做不到是指,你没有办法将匿名类型作为函数的返回值。
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 19 楼 caozhy 的回复:
可以很确定地告诉你,在语法层面做不到。
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
  • 打赏
  • 举报
回复
你要用工厂模式最好就撇开匿名类型(委托),匿名类型和泛型完全是两回事
  • 打赏
  • 举报
回复
你可以每个成员单独约束(属性除外) 按你的构想,你应该设计成泛型类(接口) 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; } }
threenewbee 2014-04-21
  • 打赏
  • 举报
回复
可以很确定地告诉你,在语法层面做不到。
xdashewan 2014-04-21
  • 打赏
  • 举报
回复
引用 16 楼 oLanJieKou 的回复:
[quote=引用 15 楼 xdashewan 的回复:] 那么能不能换一种实现方式,在父类里定义一个委托public delegate void GetL<T>(),子类初始化的时候实例化这个委托GetL<JS_Country> m1 = new GetL<JS_Country>(getList);,外部调用的时候直接调用委托m1();,你看这样行不
我的理解委托是用来处理事件传递更方便吧 我没有在除了事件处理之外的地方使用过委托 我也不清楚 [/quote] 我是说这样是不是符合你的设计模式
moonwrite 2014-04-21
  • 打赏
  • 举报
回复
搜索一下 Repository 模式
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 15 楼 xdashewan 的回复:
那么能不能换一种实现方式,在父类里定义一个委托public delegate void GetL<T>(),子类初始化的时候实例化这个委托GetL<JS_Country> m1 = new GetL<JS_Country>(getList);,外部调用的时候直接调用委托m1();,你看这样行不
我的理解委托是用来处理事件传递更方便吧 我没有在除了事件处理之外的地方使用过委托 我也不清楚
xdashewan 2014-04-21
  • 打赏
  • 举报
回复
那么能不能换一种实现方式,在父类里定义一个委托public delegate void GetL<T>(),子类初始化的时候实例化这个委托GetL<JS_Country> m1 = new GetL<JS_Country>(getList);,外部调用的时候直接调用委托m1();,你看这样行不
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
实际上做这个功能更多的是想真正去了解OOP 3大特性除了封装 基本没别的了 但是就这个问题而言 我感觉OOP应该很强大 不可能就是用来完成新手级别三层的需求的
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 12 楼 xdashewan 的回复:
直接子类不就好了,为什么一定要父类,难道你在调用的时候都不知道实际类型?
额 调用的时候知道 但是我想打到一个目的 就是说同样的代码 两个子类中的实现不一样 所用的实体类也不一样 但是调用的代码是一样的 只需要通过父类实例化相应子类就OK了 所以说我需要用到工厂模式 实际上我这个问题就是一个工厂模式 只不过加了匿名类型进去了而已 在3L 有我的现有代码 你参考那个修改下是否能行
xdashewan 2014-04-21
  • 打赏
  • 举报
回复
直接子类不就好了,为什么一定要父类,难道你在调用的时候都不知道实际类型?
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 8 楼 xdashewan 的回复:
[quote=引用 7 楼 xdashewan 的回复:]

public static class bbb
    {
        public static IQueryable<T> getList<T>(this T obj)
        {
            return null;
        }
    }
要么这样
访问的时候就

MarshalAsAttribute a = new MarshalAsAttribute();
IQueryable<MarshalAsAttribute> c = a.getList();
[/quote] 额 发现你这个不行 我是用父类去实例化子类 你这个都静态的了 毋须实例化了 我怎么调用子类哦。。
oLanJieKou 2014-04-21
  • 打赏
  • 举报
回复
引用 8 楼 xdashewan 的回复:
[quote=引用 7 楼 xdashewan 的回复:]

public static class bbb
    {
        public static IQueryable<T> getList<T>(this T obj)
        {
            return null;
        }
    }
要么这样
访问的时候就

MarshalAsAttribute a = new MarshalAsAttribute();
IQueryable<MarshalAsAttribute> c = a.getList();
[/quote] 你这个方法初步看来符合我的要求 待我试试能否使用
加载更多回复(9)
第6章 数组与字符串 96 6.1 数组基础 96 6.2 一维数组与多维数组 96 6.2.1 一维数组 97 6.2.2 二维与多维数组 99 6.2.3 可变长度的参数列表 101 6.3 字符串类 102 6.3.1 Java字符串是一种引用数据类型 103 6.3.2 字符串处理 103 6.3.3 StringBuffer类 107 6.4 字符串与数值的转换 109 6.4.1 将字符串转换成数值 109 6.4.2 将数值转换成字符串 110 6.5 对象数组 112 6.6 查找与排序 112 6.6.1 排序与查找的基础 113 6.6.2 冒泡排序法 113 6.6.3 顺序查找法 115 6.6.4 二分查找法 116 习题 117 第7章 类与对象 119 7.1 面向对象的应用程序开发 119 7.1.1 传统的应用程序开发 119 7.1.2 面向对象的应用程序开发 120 7.2 面向对象基础 120 7.2.1 对象基础 121 7.2.2 面向对象程序语言 121 7.3 类与对象 122 7.3.1 类与对象 122 7.3.2 成员变量的访问 126 7.3.3 成员方法的使用 128 7.3.4 重载方法 130 7.4 类的构造函数 132 7.4.1 类的构造函数 132 7.4.2 使用this引用对象本身 134 7.5 对象成员 136 7.6 对象使用类变量与方法 137 习题 140 第8章 继承、抽象类与接口 142 8.1 类的继承 142 8.1.1 类层次结构 142 8.1.2 类的继承 143 8.1.3 重写和隐藏父类的方法 145 8.1.4 隐藏父类的成员变量 147 8.1.5 使用父类的构造函数 149 8.2 接口 151 8.2.1 接口简介 151 8.2.2 创建与使用接口 152 8.2.3 在类实现多个接口 154 8.3 接口的继承 155 8.3.1 继承接口 156 8.3.2 接口的多重继承 157 8.4 抽象类 160 8.5 抽象类与接口 163 8.6 常量类 166 习题 168 第9章 嵌套类、多态与包 170 9.1 嵌套类 170 9.1.1 嵌套类 170 9.1.2 嵌套类的使用 173 9.2 匿名嵌套类 175 9.2.1 类继承的匿名内层类 175 9.2.2 实现接口的匿名内层类 176 9.2.3 匿名内层类与this和final关键字 178 9.3 多态基础 180 9.3.1 静态绑定与动态绑定 180 9.3.2 Java语言支持的多态 181 9.4 多态的实现 181 9.4.1 使用类继承来实现多态 181 9.4.2 使用接口来实现多态 184 9.5 包 186 9.5.1 Java包基础 186 9.5.2 package和import命令语句的使用 187 习题 190 第10章 异常处理、线程与泛型集合对象 191 10.1 Java的异常处理 191 10.1.1 异常处理的架构 191 10.1.2 Throwable类 191 10.1.3 异常处理语句 192 10.1.4 同时处理多种异常 194 10.2 抛出异常与自定义Exception类 196 10.2.1 使用throw关键字 196 10.2.2 在方法抛出异常 197 10.2.3 自定义Exception类 199 10.3 线程的基础知识 200 10.4 创建Java的线程 201 10.4.1 实现Runnable接口来创建线程 201 10.4.2 继承Thread类来创建线程 204 10.5 集合对象简介 205 10.5.1 Java Collections Framework 206 10.5.2 集合接口 206 10.5.3 泛型集合类概述 207 10.6 泛型集合类 208 10.6.1 HashSet类 208 10.6.2 ArrayList类 210 10.6.3 Iterator接口 211 10.6.4 ListIterator接口 213

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧