c# – 派生类列表中的通用函数
发布时间:2020-12-16 00:12:18 所属栏目:百科 来源:网络整理
导读:我觉得我的问题非常愚蠢,或者另一种说法是:我在代码中迷失了,现在看到一个解决方法.对问题保持太久,你的视力变得更窄更窄.另外,我对继承,多态等等还不够好 这是一个想法:我有多个派生类列表,我想在这些列表上调用泛型函数(访问和修改基类的成员).我觉得与
我觉得我的问题非常愚蠢,或者另一种说法是:我在代码中迷失了,现在看到一个解决方法.对问题保持太久,你的视力变得更窄更窄><.另外,我对继承,多态等等还不够好 这是一个想法:我有多个派生类列表,我想在这些列表上调用泛型函数(访问和修改基类的成员).我觉得与继承有关,但我无法让它现在正常运作. 这是我打算做的一个非常简单的例子:
class Baseclass { public int ID; public string Name; } class DerivedClass1 : Baseclass { } private void FuncOnBase(List<Baseclass> _collection) { // ... foreach (Baseclass obj in _collection) { ++obj.ID; } // ... } private void FuncTest() { List<DerivedClass1> collection1 = new List<DerivedClass1>(); collection1.Add(new DerivedClass1() { ID = 1 }); collection1.Add(new DerivedClass1() { ID = 2 }); collection1.Add(new DerivedClass1() { ID = 3 }); FuncOnBase(collection1); // ==> forbidden,cannot convert the derived class list to the base class list } 解决方法
要爱变异.列表< DerivedClass1>不是List< Baseclass> – 否则,FuncOnBase可能会尝试将一个Baseclass添加到列表中,编译器也不会发现它.
一个技巧是使用通用方法: private void FuncOnBase<T>(List<T> _collection) where T : Baseclass { // ... foreach (T obj in _collection) { obj.ID++; } // ... } 就我上面提到的例子而言 – 请注意我们可以在列表中添加T;特别是如果我们添加T:new()约束,或者传入(例如)params T []. 还要注意IEnumerable< T>在C#4.0 / .NET 4.0中变得协变,所以如果你只传入一个IEnumerable< Baseclass> (而不是列表)它将“按原样”工作: private void FuncOnBase(IEnumerable<Baseclass> _collection) { ///... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |