允许方法处理所有继承的类型
Allow method to work with all inherited types
我有一个 class A,B 和 C 继承了它。
我也有这样的 B 和 C 列表:List<B> listB
和 List<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");
}
}
我有一个 class A,B 和 C 继承了它。
我也有这样的 B 和 C 列表:List<B> listB
和 List<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");
}
}