c# - 派生类列表上的泛型函数

标签 c# class list derived

我觉得我的问题很愚蠢,或者换一种说法是:我太迷失在我的代码中,暂时看不到解决方法。在一个问题上停留太久,你的视野会变得越来越狭窄><.另外我对继承、多态性等还不够好

我的想法是:我有多个派生类列表,我想在这些列表上调用泛型函数(访问和修改基类的成员)。我觉得这与继承有关,但我现在无法让它按我想要的方式工作。

这是我打算做的一个非常简单的例子:

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
}

最佳答案

必须爱方差。 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)
{
   ///...
}

关于c# - 派生类列表上的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635662/

相关文章:

ios - 如何更改不同类中的变量? (iOS, swift )

list - 在 Clojure 中递归添加到列表

python - 计算 Python3 中列表的相等元组元素

Python - 尝试在 IF 语句中使用列表值

c# - WPF:绑定(bind)到自定义类属性。 PropertyChanged 已触发但 View 未更新

c# - 我如何获得更多 SQL Server 和 T-SQL 经验

c# - ReSharper [CanBeNull] 和 [NotNull] 属性可以应用于 Action 或 Func 参数吗?

c# - 为什么我在此代码中收到 IndexOutOfRangeException?

c# 将类属性标记为脏

c++ - 在 C++ 中玩弄字符串,分析字符并通过类创建功能