加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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)
{
   ///...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读