我有一堆类型映射我需要在Install方法中注册并在Uninstall方法中删除。目前我的代码看起来像这样:
安装:
var serviceLocatorConfig = new ServiceLocatorConfig();
serviceLocatorConfig.RegisterTypeMapping<IListItemRepository, ListItemRepository>();
serviceLocatorConfig.RegisterTypeMapping<ITaskRepository, TaskRepository>();
serviceLocatorConfig.RegisterTypeMapping<IIssueRepository, IssueRepository>();
...
卸载:
var serviceLocatorConfig = new ServiceLocatorConfig();
serviceLocatorConfig.RemoveTypeMapping<IListItemRepository>(null);
serviceLocatorConfig.RemoveTypeMapping<ITaskRepository>(null);
serviceLocatorConfig.RemoveTypeMapping<IIssueRepository>(null);
...
并继续进行多次映射。
这里我不喜欢的是当我添加一个新的存储库时,我必须为安装方法和卸载方法添加一个新行。我想要的是这样的东西
private readonly Dictionary<Type, Type> _typeMappings = new Dictionary<Type, Type>
{
{typeof(IListItemRepository), typeof(ListItemRepository)},
{typeof(ITaskRepository), typeof(TaskRepository)},
{typeof(IIssueRepository), typeof(IssueRepository)},
...
};
然后对于我的安装和卸载方法,我可以迭代集合......
foreach (KeyValuePair<Type, Type> mapping in _typeMappings)
{
serviceLocatorConfig.RegisterTypeMapping<mapping.Key, mapping.Value>();
}
和
foreach (KeyValuePair<Type, Type> mapping in _typeMappings)
{
serviceLocatorConfig.RemoveTypeMapping<mapping.Key>(null);
}
当我添加更多存储库时,我只会更新_typeMappings
集合,而不必担心更新这两种方法。
问题是,foreach主体中的RegisterTypeMapping
方法抱怨它期望命名空间或类型的名称。我也试过
serviceLocatorConfig.RegisterTypeMapping<typeof(mapping.Key), typeof(mapping.Value)>();
但也不喜欢。
有什么想法吗?
[编辑] RegisterTypeMapping
方法签名定义如下
public void RegisterTypeMapping<TFrom, TTo>() where TTo : TFrom, new()
{
...
}
答案 0 :(得分:1)
您正在尝试使用您真正想要正常版本的RegisterTypeMapping
的通用版本:
serviceLocatorConfig.RegisterTypeMapping(mapping.Key, mapping.Value);
修改强>
如果只有通用版本可供使用,我认为您可以使用反射和放大来构建适当的通用方法。 MakeGenericMethod()
(完全未经测试!)
serviceLocatorConfig.GetType().GetMethod("RegisterTypeMapping").MakeGenericMethod(new Type[] { mapping.Key, mapping.Value}).Invoke(serviceLocatorConfig, null);