gpt4 book ai didi

c# - 使用基类列表中的项目到泛型方法

转载 作者:行者123 更新时间:2023-12-01 18:48:29 26 4
gpt4 key购买 nike

很难想出一个好的标题,但假设我遇到了这种情况。我有一个基类:

public abstract class FooBase
{

}

我有一个通用的实现:

public class MyFoo<T> : FooBase where T : Bar
{

}

到目前为止一切顺利。抽象基础是这样我可以创建这些通用项目的异构集合:

List<FooBase> list = new List<FooBase>()
{
new MyFoo<Bar1>(),
new MyFoo<Bar2>()
}

现在问题来了。我有一个通用方法:

public void DoSomething<T>(MyFoo<T> aFoo) where T : Bar
{

}

当我使用特定 Foo 的实例调用它时,这会起作用:

DoSomething(new MyFoo<Bar1>());

但我想要一个函数,它将获取一个列表并在每个项目上调用 DoSomething:

public void DoSomethingWithList(List<FooBase> list) 
{
foreach (var item in list)
{
DoSomething(item); // doesn't work - type cannot be inferred here
}
}

那么有没有办法在运行时让它找出正确的类型并调用泛型函数?或者还有其他方法可以解决这个难题吗?

最佳答案

您可以使用动态类型 - 这将在执行时使用 item 对象的实际类型执行重载决策。指。您只需将迭代器类型更改为 dynamic像这样:

public void DoSomethingWithList(List<FooBase> list) 
{
foreach (dynamic item in list)
{
DoSomething(item);
}
}

请注意,如果您最终得到 FooBase在您的列表中不是 MyFoo<T> ,你会得到执行时间失败。您可以通过提供另一个重载来避免这种情况(如果您愿意):

public void DoSomething(FooBase x)
{
// This will be called for any items in the list that aren't
// MyFoo<T>
}

这种方法的缺点:

  • 对性能有一定影响;这是否重要取决于您的应用,但您应该对其进行测试。
  • 您会失去编译时类型安全性。
  • 它在 C# 4 之前不起作用,即 dynamic已被介绍。

如果您可以通过稍微重新设计来避免陷入这种情况,这通常是个好主意......但有时您确实需要这样的东西。

关于c# - 使用基类列表中的项目到泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23544919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com