InjectionConstructor
そもそも、なぜ を使おうとするのでしょうか。Unity は、箱から出してすぐに配列を処理する方法を知っています。
キーワードは、コンパイラのparams
構文糖衣にすぎません。カバーの下にargs2
は単純な配列があります。
[TestMethod]
public void TestMethod1()
{
var container = new UnityContainer();
// if you absolutely have to use an InjectionConstructor this should do the trick
// container.RegisterType<IMyClass, MyClass>(
// new InjectionConstructor(typeof(Class1), typeof(Class2[])));
container.RegisterType<IMyClass, MyClass>(
new InjectionConstructor(typeof(Class1), typeof(Class2[])));
container.RegisterType<Class2>("1");
container.RegisterType<Class2>("2");
container.RegisterType<Class2>("3");
var myClass = container.Resolve<IMyClass>() as MyClass;
Assert.IsNotNull(myClass);
Assert.IsNotNull(myClass.Arg2);
Assert.AreEqual(3, myClass.Arg2.Length);
}
interface IMyClass
{
}
class MyClass : IMyClass
{
public Class1 Arg1 { get; set; }
public Class2[] Arg2 { get; set; }
public MyClass(Class1 arg1, params Class2[] arg2)
{
Arg1 = arg1;
Arg2 = arg2;
}
}
class Class1
{
}
class Class2
{
}
アップデート
名前付き登録の一部のみを使用している場合は、ResolvedArrayParameter
.
container.RegisterType<IMyClass, MyClass>(
new InjectionConstructor(
typeof(Class1),
new ResolvedArrayParameter<Class2>(
new ResolvedParameter<Class2>("1"),
new ResolvedParameter<Class2>("2"))));
ブル!これは非常に醜いですが、問題を解決するはずです。