C# 接受接口参数并对子类进行操作的包装器方法
我有一个接口“I”,其中包含字段“ID”。从该接口,我有实现它的对象A、B、C、D。在一个完全独立的类数据库中,我有4个名为Foo的方法,它们分别对a、B、C和D进行操作 在为Foo编写一个方法时,该方法对一组包含子类缓存的Dictionary对象进行操作,我注意到我正在一遍又一遍地编写相同的代码。看起来像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;
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方法的类,该方法与您当前处理的类型相匹配。任何类与其数据库转换处理程序之间的匹配都是自动的