允许方法处理所有继承的类型

Allow method to work with all inherited types

我有一个 class A,B 和 C 继承了它。 我也有这样的 B 和 C 列表:List<B> listBList<C> listC.

我想向这些列表中添加元素,但只有在我进行一些逻辑运算之后。我制作了一个方法,它接受任何类型的列表和要添加的相关项目。

public void AddItemToList<T>(List<T> item_list, T new_item)
{
    //do logic with properties of A...
}

我需要能够将此方法用于两个列表,如下所示:

AddItemToList<B>(listB, new B());
AddItemToList<C>(listC, new C());

但是,由于类型是通用的,我无法使用 A 的属性在方法内部执行我想要的逻辑。

如果我在方法中使用类型 A,那么我无法在不先转换列表或项目的情况下传递它们。

有没有办法设置类型,以便我可以传递匹配的参数,同时仍然能够在方法内部执行逻辑?

如果您的泛型方法需要执行 type-specific 功能,那么它就不是泛型的。但是,您可以采用函数式方法并传入执行 type-specific 工作的 Action<T> 委托:

public void AddItemToList<T>(List<T> item_list, T new_item, Action<T> effect)
{
    effect(new_item);
    // etc
}

然后调用它:

// `x` below is inferred to be of type `int`
AddItemToList(new List<int>(), 0 ,x => Console.WriteLine(x + 1)); 

您可以对 T 进行约束,在方法声明中使用 where

where (generic type constraint)

using System;
using System.Collections.Generic;

class A
{
    public int PropA;
}

class B : A
{
}

class C : A
{
}

class NotDerivedFromA
{
}

class Foo
{
    // where T:A force T to be A or a derived class
    public void AddItemToList<T>(List<T> item_list, T new_item) where T:A
    {
        Console.WriteLine(new_item.PropA);
    //do logic with properties of A...
    }
}

public class Program
{
    public static void Main()
    {
        List<A> listA = new();
        List<B> listB = new();
        List<C> listC = new();
        
        Foo foo = new();
        
        foo.AddItemToList<A>(listA, new A());
        foo.AddItemToList<B>(listB, new B());
        foo.AddItemToList<C>(listC, new C());
        
        // this doen't compile:  NotDerivedFromA doesn't satisfy the constraint
        //foo.AddItemToList<NotDerivedFromA>(new List<NotDerivedFromA>(), new NotDerivedFromA());
        
        Console.WriteLine("Hello World");
    }
}