请问大家如何在非泛型类中使用泛型属性

比如我创建了一个泛型为是这样子的
public class Model<T> where T : IModel, new()
{
private IDbHelper dbHelper;
public Model(IDbHelper dbHelper)
{
this.dbHelper = dbHelper;
}

#region 返回单个实体
/// <summary>
/// 根据单个属性及属性值返回Model实例。
/// </summary>
public T GetModelByKey(Expression<Func<T, object>> expression, object primaryKeyValue)
{
……
}
}

然后我需要将这个类作为另一个非泛型类的属性,比如如下:
public class CURD
{
private Model<T> model;
public Model<T> Model
{
get
{
if (model == null)
{
model = new Model<T>(dbHelper);
model.Constraints = Conventions;
}

return model;
}
}
}

不能将CURD改为泛型类,请问要怎么实现呢?
...全文
707 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
_lee_chong 2015-08-05
  • 打赏
  • 举报
回复
引用 19 楼 wggfcusmq 的回复:
[quote=引用 14 楼 sp1234 的回复:] [quote=引用 11 楼 wggfcusmq 的回复:] T就是继承IModel的子类
T 哪里是什么类型?它只是一个操作符变量。 你看来对泛型完全理解错了![/quote] 其实,我只是单纯的以为,方法可以这样子定义 public T GetModelByKey<T>(Expression<Func<T, object>> expression, object primaryKeyValue) where T : IModel, new() { string viewName = GetTableName<T>(); string primaryKey = PropertyHelper.ResolvePropertyName(expression); return InitModel<T>(primaryKey, primaryKeyValue, viewName); } 那么作为本质和方法是一样的属性,可能也有这么一种定义的方法,看来还真不行。[/quote] 属性和方法本质是差不多,但是假设用类似宏的方式去展开: 你想要的是类似这样 public Model<T> ABC{get;set;} 假设语法允许就大概成这样了: public Model<T> getABC(){return _abc;} public void setABC(Model<T> value){ _abc = value;} 这明显和泛型方法不是一码事,而且泛型方法的调用是这样: public Model<T> getABC<T>(); Model<object> ddd = getABC<object>(); 属性是这样: Model<object> ddd = ABC; 这类型就传不过去呢,除非属性调用的时候这样 Model<object> ddd = ABC<object>; 因为泛型是静态的,属性是会自动关联成员变量的,属性要是有泛型,那不是有可能会自动创建很多的私有变量,这样的话,语法的实现方面要弄的多复杂多麻烦, c#的“属性”本来就是 代理 ,是为了方便使用才有了“属性”这个特性,给他加上泛型反而麻烦且难以使用了,要来干嘛; ------------------------------- 你既然想实现泛型属性的那种效果,拿你自己封装代理方法不就完了; private object _abc; public void SetABC<T>(Model<T> val) { _abc = val; } public Model<T> GetABC<T>() { return _abc as Model<T>; }
老李家的小二 2015-08-05
  • 打赏
  • 举报
回复
给我大牛,我是来学习的
moonwrite 2015-08-04
  • 打赏
  • 举报
回复
nopCommerce Repository 模式
_lee_chong 2015-08-04
  • 打赏
  • 举报
回复
看了半天才大概明白楼主意思。。。。就你这代码来说,建议俩改动办法 1, CURD 改成泛型 2, 定义接口xxxx Model<T> 实现接口xxxx CURD中用xxxx作为属性的类型 ------------------------ 如果以上两种方式都不愿意使用,你说说你为啥这么jiang 为啥这么ban man 或者说出你的实际需求看看
於黾 2015-08-04
  • 打赏
  • 举报
回复
这种比较抽象的概念,如果举例说明,其实已经偏离了它的本质 但是为了让你能理解,我还是要举个例子 比如你有个房间的模板,它就只是房间,没有具体的属性 然后底下又包含圆形的房间,方形的房间,长方形的房间,不规则的房间... 那么你可以在盖楼的时候套用某个模板,把房间盖成特定的形状 而绝对不要想在开门的时候才决定房间的形状
於黾 2015-08-04
  • 打赏
  • 举报
回复
引用 6 楼 wggfcusmq 的回复:
我只是想将泛型类型延时到调用Model属性时才指定,可能是我的例子举的不恰当。
已经说的很清楚明白了 它是静态编译的,而不是动态编译的 所以必须在编译时就让它有一个确定的类型,而不是等到运行起来在去修改它的类型 看来你需要的并不是<T>,而是个object
  • 打赏
  • 举报
回复
引用 11 楼 wggfcusmq 的回复:
T就是继承IModel的子类
T 哪里是什么类型?它只是一个操作符变量。 你看来对泛型完全理解错了!
  • 打赏
  • 举报
回复
它奶奶的,又有“非法词组”了。
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
[quote=引用 11 楼 wggfcusmq 的回复:] T就是继承IModel的子类
T 哪里是什么类型?它只是一个操作符变量。 你看来对泛型完全理解错了![/quote] 其实,我只是单纯的以为,方法可以这样子定义 public T GetModelByKey<T>(Expression<Func<T, object>> expression, object primaryKeyValue) where T : IModel, new() { string viewName = GetTableName<T>(); string primaryKey = PropertyHelper.ResolvePropertyName(expression); return InitModel<T>(primaryKey, primaryKeyValue, viewName); } 那么作为本质和方法是一样的属性,可能也有这么一种定义的方法,看来还真不行。
  • 打赏
  • 举报
回复
T就是继承IModel的子类
Saleayas 2015-08-04
  • 打赏
  • 举报
回复
哪里再做一次类型转换的时候,T是什么呢? 如果你能指定,直接使用 泛型的方法就可以了。
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
[quote=引用 11 楼 wggfcusmq 的回复:] T就是继承IModel的子类
T 哪里是什么类型?它只是一个操作符变量。 你看来对泛型完全理解错了![/quote] 你又在纠结概念性的东西了,从我的代码也可以看出来,我的T,限定于IModel类型,并不是说他就是IModel类型。
  • 打赏
  • 举报
回复
引用 8 楼 Saleayas 的回复:
使用 IModel 接口。
使用接口就意味着我在调用时候,还得再做一次类型转换,不能一步到位。
Saleayas 2015-08-04
  • 打赏
  • 举报
回复
使用 IModel 接口。
失落的神庙 2015-08-04
  • 打赏
  • 举报
回复
不能发帖。 - - 为何? 提示非法词组。
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
泛型不是什么动态语言模板,而是一个静态语言的、高效率的模板。 在编译时泛型参数都被计算过了、扩展过了,例如 List<int>跟List<double>会被作为两个毫无关系的新的类型而编译。在运行时,绝没有什么 Model<T> 类对象存在,你想用 Model<T> 来表达无数种毫无关系的对象的什么关系呢?
我只是想将泛型类型延时到调用Model属性时才指定,可能是我的例子举的不恰当。
  • 打赏
  • 举报
回复
引用 1 楼 devmiao 的回复:
用方法代替属性,因为属性本来也就是方法。方法支持泛型。
不想在方法中指定泛型,因为Model类中有10多个方法,如果在方法中指定泛型类型,那么在调用每个方法时都必须一指定一个类型,如果我定义泛型类,那么只需要在实例化时指定一次实体类型就好了。
  • 打赏
  • 举报
回复
泛型不是什么动态语言模板,而是一个静态语言的、高效率的模板。 在编译时泛型参数都被计算过了、扩展过了,例如 List<int>跟List<double>会被作为两个毫无关系的新的类型而编译。在运行时,绝没有什么 Model<T> 类对象存在,你想用 Model<T> 来表达无数种毫无关系的对象的什么关系呢?
  • 打赏
  • 举报
回复
无法实现。这样写的 private Model<T> model; 根本不能知道是个什么东西,无法编译。
加载更多回复(1)

110,559

社区成员

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

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

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