如何从使用中推断出参数值?

时间:2017-07-05 22:13:20

标签: c#

所以我正在关注AutoInjector和Automapper在线的一些代码片段,并注意到一些我不太懂的东西。

在代码中,AutoInjector正在注册Automapper以便在此行中使用。

container.Register(() => config.CreateMapper(container.GetInstance));

我注意到container.GetInstance没有传递任何内容。

经过一些修改后,我尝试在控制台应用中执行var instance = container.GetInstance();,但它出现错误The type arguments for method 'Container.GetInstance<TService>() cannot be inferred from the usage. Try specifying the type arguments explicitly.

显然,传递的参数是从外部方法config.CreateMapper()

推断出来的

我想知道是否有办法逐步完成代码,以便我可以看到传递给container.GetInstance()的内容。当我单步执行代码时,它只是跨过该行,并没有告诉我传递给方法的内容。

2 个答案:

答案 0 :(得分:1)

CreateMapper期望其参数为一个输入Type并返回object的函数。

Func<Type, object>

看起来container.GetInstance就是这样一个功能。

由于您似乎对内部感兴趣,因此它们是:

MapperConfiguration.cs

public IMapper CreateMapper() => new Mapper(this);

Mapper.cs

public Mapper(IConfigurationProvider configurationProvider)
    : this(configurationProvider, configurationProvider.ServiceCtor)
{
}

public Mapper(IConfigurationProvider configurationProvider, Func<Type, object> serviceCtor)
{
    _configurationProvider = configurationProvider;
    _serviceCtor = serviceCtor;
    DefaultContext = new ResolutionContext(new ObjectMappingOperationOptions(serviceCtor), this);
}

答案 1 :(得分:1)

  

我注意到container.GetInstance没有传递任何内容。

因为什么都没有。 CreateMapper的参数是委托,更具体地说是Func<Type, object>;所以config.CreateMapper(container.GetInstance)与你写的完全一样:

config.CreateMapper(type => GetInstance(type));

你当时没有传递任何具体论据,你只是简单地告知&#34; container如何为任何给定的type创建映射器,

它与这个简单的代码片段中的以下LINQ用法相同(因此可能重复注释):

public static string ToString<T>(T arg) => arg.ToString();

var ints = Enumerable.Empty<int>();
var strs = ints.Select(ToString); //or ints.Select(i => ToString(i))

ToString来电中Select传递了哪些参数?好吧,没有,你只是告诉Select如何将int映射到string,你还没有处理任何整数(你无论如何也无法做到,枚举是空的!)。枚举枚举时,参数将传递给委托(或不传递)。

您的代码是相同的,只要需要为任何给定类型创建映射器,类型Type(如果有)的参数将被传递到GetInstance。您发布的代码与何时 具体type无关,这就是为什么在调试时您只需跨过该行。