我有两个版本的数据管理器,以及一个抽象这两个管理器的接口。所有这两个管理器都将数据的描述作为字符串,从而隐藏特定的数据结构。
现在我需要添加一个参数为Action<Item>
的方法(而不是Action<string>
和string
存储描述(,这个操作被传递给SDK,不能修改。
在这种情况下,Action<Item>
根据Item
的具体实现而变化。如何以C#的方式添加此方法?
以下是示例
- 不同数据管理器的接口
// the interface
interface IContentManager
{
void UpdateProduct(string id, string productDescription);
// TODO: public void ApplyForAll(Action<???> op)
}
- 基于数据库SDK的数据管理器的第一个版本
数据库SDK提供了这些不能修改的类
class ProductItem { }
class ProductDBWriter
{
// this method cannot be modified
public void ApplyForAll(Action<ProductItem> op) { }
}
基于数据库SDK 的数据管理器
class DBContentManager
{
void UpdateProduct(string id, string productDescription) { }
public void ApplyForAll(Action<ProductItem> op)
{
_writer.ApplyForAll(op);
}
private ProductDBWriter _writer;
}
- 数据管理器的第二个版本,一个轻量级版本
class ProductItemSlim { }
class SlimContentManager
{
void UpdateProduct(string id, string productDescription) { }
// TODO: public void ApplyForAll(Action<???> op)
}
问题是:C#抽象ApplyForAll
方法的方法是什么?
如果我理解正确,您希望创建一个依赖于未知类型的接口。这正是gernerics的初衷。假设您有一个IContentManager<T>
。然后,您可以在ApplyForAll
中传递Action<T>
,例如,您的SlimContentManager
可以实现IContentManager<SlimContent>
。