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

    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?
        }
    }

白衣染霜花
浏览 870回答 14
14回答

明月笑刀无情

你的是T是Animal,animal没有Leg,Leg是Dog的;因此需要判断 v is Dog 然后 (v as Dog).Leg; 除非你t直接是Dog你上面就可以直接通过了。

杨魅力

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

宝慕林4294392

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

Smart猫小萌

@风人: 是的 忘记判断了

慕少森

不太好办,你T类型限制在animal上了,变通点的做法是把dog.legs通过委托带进去(带狗腿!?) void Print(Func<T,object> printQuery) {   ...   Console.WriteLine(printQuery(v)); }

MMMHUHU

这样就是感觉挺麻烦的,如果要用到的数据更多的话就感觉好糟糕-- 2楼方法觉得很好,,嘿嘿嘿,谢谢解答~~

UYOU

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

皈依舞

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

阿波罗的战车

@风人: 泛型限制的有点好处就是编译安全性,如果一强转那么就失去了这个保证,而且同时增加了对实现的耦合度。 这里正确姿势是提个接口,接口方法的用途就是返回狗腿鸡毛啥的玩意(看你需求),Print方法继续加泛型限制Print<V>() where V:T,ICountable (ICountable返回狗腿数量) 这样就能在保证安全性的同时保证灵活性。

互换的青春

@Daniel Cai: 嗯嗯嗯,刚才又试了试访问Animal两个子类的特有的属性,更加理解了~~ 非常感谢你的指导!O(∩_∩)O谢谢
打开App,查看更多内容
随时随地看视频慕课网APP