这是父类 抽象类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>; }
public IQueryable<T> getList<T>() { return null; }
把T放在类中public abstract class EntityFactory<T> { public IQueryable<T> getList() { return null; } }
public static class bbb { public static IQueryable<T> getList<T>(this T obj) { return null; } }要么这样
访问的时候就MarshalAsAttribute a = new MarshalAsAttribute(); IQueryable<MarshalAsAttribute> c = a.getList();
访问的时候就MarshalAsAttribute a = new MarshalAsAttribute(); IQueryable<MarshalAsAttribute> c = a.getList(); 你这个方法初步看来符合我的要求 待我试试能否使用
访问的时候就MarshalAsAttribute a = new MarshalAsAttribute(); IQueryable<MarshalAsAttribute> c = a.getList(); 额 发现你这个不行 我是用父类去实例化子类 你这个都静态的了 毋须实例化了 我怎么调用子类哦。。
那么能不能换一种实现方式,在父类里定义一个委托public delegate void GetL<T>(),子类初始化的时候实例化这个委托GetL<JS_Country> m1 = new GetL<JS_Country>(getList);,外部调用的时候直接调用委托m1();,你看这样行不
搜索一下 Repository 模式
你可以每个成员单独约束(属性除外) 按你的构想,你应该设计成泛型类(接口) 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; } }
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢 我说的做不到是指,你没有办法将匿名类型作为函数的返回值。
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢 我说的做不到是指,你没有办法将匿名类型作为函数的返回值。即是说,我这个问题解决不了了吗
但是linq语法 var q=from r in db.js_country select r; 这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢 我说的做不到是指,你没有办法将匿名类型作为函数的返回值。即是说,我这个问题解决不了了吗 从语法的角度解决不了,不等于说你写不出程序。一个是,你需要人工定义那些本来作为匿名类型的类型。另一个是,你可以返回List<object>,在主程序中用dynamic类型接收(C# 4.0+这样最简单),或者用object类型接收并且反射。还有就是将Select的过程交给调用者自己做,用委托传入,这样绕开了返回一个匿名类型这个问题了。
OK 这个地方采用BZ的”在主程序中用dynamic类型接收(C# 4.0+这样最简单)“ 这种解决了问题 不过有个不好的地方就是无法使用VS的自动提示功能呢了 因为是动态的 得在运行时再解析 不过也算完美解决了
因为类型是从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);
{
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>;
}
public IQueryable<T> getList<T>()
{
return null;
}
{
public IQueryable<T> getList()
{
return null;
}
}
public static class bbb
{
public static IQueryable<T> getList<T>(this T obj)
{
return null;
}
}要么这样
IQueryable<MarshalAsAttribute> c = a.getList();
如果说像我上面给的例子那样 那每个方法调用都需要实例化 下面这样EntityFactory f=new TEFHelper(Model1);
f.getModel1();EntityFactory f2 = new TEFHelper(Model2);
f.getModel2();
这样的貌似比之前那种还麻烦了
IQueryable<MarshalAsAttribute> c = a.getList();
你这个方法初步看来符合我的要求 待我试试能否使用
IQueryable<MarshalAsAttribute> c = a.getList();
额 发现你这个不行 我是用父类去实例化子类 你这个都静态的了 毋须实例化了 我怎么调用子类哦。。
Repository 模式
按你的构想,你应该设计成泛型类(接口)
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;
}
}
这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
我说的做不到是指,你没有办法将匿名类型作为函数的返回值。
我为什么想到用这种方式去实现 就是因为看到linq的那种写法 很方便 但是我看封装的程序集只有一个声明 所以还是不清楚到底怎么样才能实现类似于linq的写法 ,但是你也看到了 我上面这个功能确实很需要这个匿名类型 如果没有它 这个功能要大打折扣的
这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
我说的做不到是指,你没有办法将匿名类型作为函数的返回值。即是说,我这个问题解决不了了吗
这种编译器就能推导出q的类型为iqueryable<js_country> 为什么我的不行呢
我说的做不到是指,你没有办法将匿名类型作为函数的返回值。即是说,我这个问题解决不了了吗 从语法的角度解决不了,不等于说你写不出程序。一个是,你需要人工定义那些本来作为匿名类型的类型。另一个是,你可以返回List<object>,在主程序中用dynamic类型接收(C# 4.0+这样最简单),或者用object类型接收并且反射。还有就是将Select的过程交给调用者自己做,用委托传入,这样绕开了返回一个匿名类型这个问题了。
不过有个不好的地方就是无法使用VS的自动提示功能呢了 因为是动态的 得在运行时再解析 不过也算完美解决了
{
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);