From d23c819933af22256f93936f5b8700f314dbf33d Mon Sep 17 00:00:00 2001 From: maximv Date: Mon, 20 Jul 2020 15:03:20 +0300 Subject: [PATCH] even better fix for #294 at cast of some memory --- src/DryIoc/Container.cs | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/DryIoc/Container.cs b/src/DryIoc/Container.cs index e6eee361e..062ceda50 100644 --- a/src/DryIoc/Container.cs +++ b/src/DryIoc/Container.cs @@ -8162,16 +8162,11 @@ public static ParameterServiceInfo Of(ParameterInfo parameter) : ServiceDetails.Of(ifUnresolved: IfUnresolved.ReturnDefault, defaultValue: parameter.DefaultValue)); } + /// The parameter type or dereferenced parameter type for `ref`, `in`, `out` parameters + public readonly Type DereferencedParameterType; + /// Service type specified by . - public virtual Type ServiceType - { - get - { - // todo: @perf memoise the type - var paramType = Parameter.ParameterType; - return paramType.IsByRef ? paramType.GetElementType() : paramType; - } - } + public virtual Type ServiceType => DereferencedParameterType; /// Optional service details. public virtual ServiceDetails Details => ServiceDetails.Default; @@ -8187,7 +8182,13 @@ public IServiceInfo Create(Type serviceType, ServiceDetails details) => public override string ToString() => new StringBuilder().Print(this).Append(" as parameter ").Print(Parameter.Name).ToString(); - private ParameterServiceInfo(ParameterInfo parameter) { Parameter = parameter; } + private ParameterServiceInfo(ParameterInfo p) + { + Parameter = p; + DereferencedParameterType = p.ParameterType.IsByRef + ? p.ParameterType.GetElementType() + : p.ParameterType; + } private class WithDetails : ParameterServiceInfo { @@ -8921,22 +8922,20 @@ public TResult Is( Func field = null) { var info = _serviceInfo; - if (info is ParameterServiceInfo) + if (info is ParameterServiceInfo par) { if (parameter != null) - return parameter(((ParameterServiceInfo)info).Parameter); + return parameter(par.Parameter); } - else if (info is PropertyOrFieldServiceInfo) + else if (info is PropertyOrFieldServiceInfo propOrField) { - var propertyOrFieldServiceInfo = (PropertyOrFieldServiceInfo)info; - var propertyInfo = propertyOrFieldServiceInfo.Member as PropertyInfo; - if (propertyInfo != null) + if (propOrField.Member is PropertyInfo propertyInfo) { if (property != null) return property(propertyInfo); } else if (field != null) - return field((FieldInfo)propertyOrFieldServiceInfo.Member); + return field((FieldInfo)propOrField.Member); } else if (root != null) return root();