匿名泛型集合的重写

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

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


上面的T是一个匿名类型 这是我想要在子类里重写的方法结构 那如何在父类(抽象类)里去写一个合适的让子类实现呢 这个匿名类型好烦
...全文
349 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

111,093

社区成员

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

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

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