为了账号安全,请及时绑定邮箱和手机立即绑定

c#:在泛型类中如何访问 约束基类 的子类对象 的独特字段?

c#:在泛型类中如何访问 约束基类 的子类对象 的独特字段?

C#
白衣染霜花 2018-12-06 16:40:26
public abstract class Animal{} public class Dog:Animal{ public int Legs{ get; set;} } public class An<T>where T:Animal{ public List<T> l = new List<T>();//给v中保存Dog类型数据 public void Print(){ foreach (var v in l) Console.WriteLine(l.Legs);//怎么访问v中的Legs? } }
查看完整描述

14 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

你的是T是Animal,animal没有Leg,Leg是Dog的;因此需要判断 v is Dog 然后 (v as Dog).Leg;

除非你t直接是Dog你上面就可以直接通过了。

查看完整回答
反对 回复 2018-12-24
?
杨魅力

TA贡献1811条经验 获得超6个赞

给它转型试试?  转型后 看能不能得到legs这个属性

查看完整回答
反对 回复 2018-12-24
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

转型不行,父类对象是强转不了子类对象的,2楼方法完美解决,哈哈哈。谢谢解答~~

查看完整回答
反对 回复 2018-12-24
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

@风人: 是的 忘记判断了

查看完整回答
反对 回复 2018-12-24
?
慕少森

TA贡献2019条经验 获得超9个赞

不太好办,你T类型限制在animal上了,变通点的做法是把dog.legs通过委托带进去(带狗腿!?)

void Print(Func<T,object> printQuery)

{

  ...

  Console.WriteLine(printQuery(v));

}

查看完整回答
反对 回复 2018-12-24
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这样就是感觉挺麻烦的,如果要用到的数据更多的话就感觉好糟糕--

2楼方法觉得很好,,嘿嘿嘿,谢谢解答~~

查看完整回答
反对 回复 2018-12-24
?
UYOU

TA贡献1878条经验 获得超4个赞

@风人: 这个。。。。你泛型这样用的姿势不太对。

查看完整回答
反对 回复 2018-12-24
?
皈依舞

TA贡献1851条经验 获得超3个赞

@Daniel Cai: 是挺别扭--刚学,不太会用。。

查看完整回答
反对 回复 2018-12-24
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

@风人: 泛型限制的有点好处就是编译安全性,如果一强转那么就失去了这个保证,而且同时增加了对实现的耦合度。

这里正确姿势是提个接口,接口方法的用途就是返回狗腿鸡毛啥的玩意(看你需求),Print方法继续加泛型限制Print<V>() where V:T,ICountable (ICountable返回狗腿数量)

这样就能在保证安全性的同时保证灵活性。

查看完整回答
反对 回复 2018-12-24
?
互换的青春

TA贡献1797条经验 获得超6个赞

@Daniel Cai: 嗯嗯嗯,刚才又试了试访问Animal两个子类的特有的属性,更加理解了~~

非常感谢你的指导!O(∩_∩)O谢谢

查看完整回答
反对 回复 2018-12-24
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

2l的方法是好.但是你的问题就是错的.

既然泛型了.就不可能还限定子类.限定子类了.还泛型干嘛.

查看完整回答
反对 回复 2018-12-24
?
九州编程

TA贡献1785条经验 获得超4个赞

这个确实是,就是现在学到这,觉得这样定义一个容器类挺好的:

用一个泛型数组来保存Animal类各种子类的数据,就是可以定义一个An<Dog>对象来保存n个Dog类对象,也可以定义一个An<Pig>来保存n个Pig对象(Pig也是Animal的子类),因为Dog和Pig都是Animal子类,所以用泛型约束成Animal基类约束。并且在这个泛型容器类里对这个数组进行操作。

查看完整回答
反对 回复 2018-12-24
  • 14 回答
  • 0 关注
  • 869 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信