StructureMap 中的 C# lambda
C# lambda in StructureMap
使用 StructureMap 4,我是 C# 的新手,我想知道为什么会出现编译错误:
var di = new Container(_ =>
{
// (1) compile error: CS1503: Argument 1: cannot convert from 'StructureMap.IContext' to '...ITest'
_.For<Func<ITest, ITestRunner>>().Use( arg => new TestRunner(arg) );
// (2) compiles OK
Func<ITest, ITestRunner> f1 = arg => new TestRunner(arg);
_.For<Func<ITest, ITestRunner>>().Use( f1 );
// (3) with cast compiles ok
_.For<Func<ITest, ITestRunner>>().Use( (Func<ITest, ITestRunner>)( arg => new TestRunner(arg)));
});
是否有紧凑的语法,我不需要 f1
变量 (2) 并且不需要强制转换重复类型 (3)?
发生这种情况是因为方法 For
中的类型参数表示您要为其定义不同实例创建委托的类型或 class。在你的代码中它是 Func<ITest, ITestRunner>
,它告诉 StructureMap
当我想要一个 Func<ITest, ITestRunner>
类型的对象时,使用我在 Use
中指定的任何内容。
我的猜测是您希望地图在添加 ITest
时使用 TestRunner
。在这种情况下,类型参数将只是 ITest
,如下所示:
_.For<ITest>().Use(arg => new TestRunner(arg));
请注意,即使其他两个代码块确实 编译了,它们也不会为您提供所需的结果。相反,对于每个 Func<ITest, ITestRunner>
,StructureMap
将使用传递给 Use
.
的值
使用 StructureMap 4,我是 C# 的新手,我想知道为什么会出现编译错误:
var di = new Container(_ =>
{
// (1) compile error: CS1503: Argument 1: cannot convert from 'StructureMap.IContext' to '...ITest'
_.For<Func<ITest, ITestRunner>>().Use( arg => new TestRunner(arg) );
// (2) compiles OK
Func<ITest, ITestRunner> f1 = arg => new TestRunner(arg);
_.For<Func<ITest, ITestRunner>>().Use( f1 );
// (3) with cast compiles ok
_.For<Func<ITest, ITestRunner>>().Use( (Func<ITest, ITestRunner>)( arg => new TestRunner(arg)));
});
是否有紧凑的语法,我不需要 f1
变量 (2) 并且不需要强制转换重复类型 (3)?
发生这种情况是因为方法 For
中的类型参数表示您要为其定义不同实例创建委托的类型或 class。在你的代码中它是 Func<ITest, ITestRunner>
,它告诉 StructureMap
当我想要一个 Func<ITest, ITestRunner>
类型的对象时,使用我在 Use
中指定的任何内容。
我的猜测是您希望地图在添加 ITest
时使用 TestRunner
。在这种情况下,类型参数将只是 ITest
,如下所示:
_.For<ITest>().Use(arg => new TestRunner(arg));
请注意,即使其他两个代码块确实 编译了,它们也不会为您提供所需的结果。相反,对于每个 Func<ITest, ITestRunner>
,StructureMap
将使用传递给 Use
.