【发布时间】:2011-06-14 21:31:20
【问题描述】:
我正在尝试调用 Unity 容器中的 RegisterType 方法。 RegisterType 共有 16 个覆盖(其中一些是参数,一些是类型)。
我正在尝试执行以下操作:
Container.RegisterType<IMyDataProvider, MockData.MockProvider>("MockData", new ContainerControlledLifetimeManager())
使用 GetMethod() 完全失败,所以我最终做了这个丑陋的事情:
MethodInfo registerTypeGeneric = Container.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance).
Where(p => p.ToString() == "Microsoft.Practices.Unity.IUnityContainer RegisterType[TFrom,TTo](System.String, Microsoft.Practices.Unity.LifetimeManager, Microsoft.Practices.Unity.InjectionMember[])").FirstOrDefault();
MethodInfo registerTypeSpecific = registerTypeGeneric.MakeGenericMethod( new Type[] { typeof(IMyDataProvider), Assembly.LoadFrom("MockData.dll").GetType("MockData.MockProvider") });
registerTypeSpecific.Invoke(Container, new object[] { "MockData", new ContainerControlledLifetimeManager() });
这很好用,直到 Invoke 因为我没有 InjectionMember 参数而抱怨(它们是可选的,我没有任何可提供的参数)。因此,根据文档,我必须使用 Type.InvokeMember() 来调用带有可选参数的方法。
所以我这样做了:
Binder binder = new BootstrapperBinder();
Container.GetType().InvokeMember("RegisterType",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.OptionalParamBinding | BindingFlags.InvokeMethod,
binder,
Container,
new object[] { "MockData", new ContainerControlledLifetimeManager() });
我的 BoostrapperBinder 类是这样做的:
public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] names, out object state)
{
Type mockProvider = Assembly.LoadFrom("MockData.dll").GetType("MockData.MockProvider");
state = new object();
MethodInfo mi = Container.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance).
Where(p => p.ToString() == "Microsoft.Practices.Unity.IUnityContainer RegisterType[TFrom,TTo](System.String, Microsoft.Practices.Unity.LifetimeManager, Microsoft.Practices.Unity.InjectionMember[])").FirstOrDefault();
return mi.MakeGenericMethod(new Type[] { typeof(ICarrierApprovalDataChangeAccessorEndPoint), mockProvider });
}
是的,它很丑,但我只是在这种情况下使用它,所以它可以完成这项工作。
现在,问题是,它仍然在抱怨缺少第三个参数。我也不能传递 null 或 Missing.Value,否则它会发出嘶哑的声音。我尝试过使用和不使用 BindingFlags.OptionalParamBinding。我被难住了。
(已编辑以将 Container.RegisterType 示例放入代码中)
【问题讨论】:
标签: c# generics reflection overriding