C# 接受接口参数并对子类进行操作的包装器方法

C# 接受接口参数并对子类进行操作的包装器方法,c#,generics,C#,Generics,我有一个接口“I”,其中包含字段“ID”。从该接口,我有实现它的对象A、B、C、D。在一个完全独立的类数据库中,我有4个名为Foo的方法,它们分别对a、B、C和D进行操作 在为Foo编写一个方法时,该方法对一组包含子类缓存的Dictionary对象进行操作,我注意到我正在一遍又一遍地编写相同的代码。看起来像 foreach(A in ACache.Values) { int ID = A.ID; Database.Foo(A); int newID = A.ID;

我有一个接口“I”,其中包含字段“ID”。从该接口,我有实现它的对象A、B、C、D。在一个完全独立的类数据库中,我有4个名为Foo的方法,它们分别对a、B、C和D进行操作

在为Foo编写一个方法时,该方法对一组包含子类缓存的Dictionary对象进行操作,我注意到我正在一遍又一遍地编写相同的代码。看起来像

foreach(A in ACache.Values)
{
    int ID = A.ID;
    Database.Foo(A);
    int newID = A.ID;
    Bar(A);
}
我必须对我所有的缓存执行此操作,总共大约有11个,所以我尝试编写某种通用方法来执行这些操作。Bar是在I上运行的,所以没有问题。我看到的唯一问题是Database.Foo,因为尽管实现I的所有类型都有Foo的实现,但编写一个简单的包装器如下:

void FooWrapper<T>(T obj) where T: I  { Database.Foo(obj); }
FooWrapper<T>(IEnumerable<T> items, Func<T, bool> fooDelegate) where T : I
{
    foreach(T item in items)
    {
        int oldId = item.ID;
        fooDelegate(item);
        int newId = item.ID;
        Bar(item);
    }
}
EDIT2:好吧,我可以这样写FooWrapper:

void FooWrapper<T>(T obj) where T: I  { Database.Foo(obj); }
FooWrapper<T>(IEnumerable<T> items, Func<T, bool> fooDelegate) where T : I
{
    foreach(T item in items)
    {
        int oldId = item.ID;
        fooDelegate(item);
        int newId = item.ID;
        Bar(item);
    }
}
FooWrapper(IEnumerable items,Func foodegate),其中T:I
{
foreach(项目中的T项目)
{
int oldId=item.ID;
代表(项目);
int newId=item.ID;
酒吧(项目);
}
}
并称之为:

FooWrapper(ACache.Values, (Func<A, bool>) Database.Foo);
FooWrapper(ACache.Values,(Func)Database.Foo);

这是可行的,但我更喜欢更优雅的方式,还有其他方法可以避免传递委托吗?

如果使用依赖项注入,那么使用考虑类的方法注册实现接口IDataBaseDoingStufpto的组件就很简单了

interface IDatabaseDoingStuffTo<T>{
    void DoStuff(Database db, T t);
}
retrieveDatabaseBridge
可能来自:

  • 依赖注入
  • 类型a和桥接类实例(简单字典)之间的键值映射
  • 配置(配置文件中类型之间的映射…)

所以有一些解决方案,但我们可能需要更多关于您当前可用的信息

您能提供关于您的代码的更多细节吗?请发布Database.Foo()的签名,您能解释一下依赖项注入以及它与我的代码的关系吗?只有一个数据库类,我唯一需要的是让包装器方法对实现I的对象进行操作,作为其实现类型,这样我就可以调用Database.foodi的适当实例。使用DI,您可以解析任何实现IDatabaseDoingStufTo方法的类,该方法与您当前处理的类型相匹配。任何类与其数据库转换处理程序之间的匹配都是自动的