Skip to content

Commit

Permalink
even better fix for #294 at cast of some memory
Browse files Browse the repository at this point in the history
  • Loading branch information
maximv committed Jul 20, 2020
1 parent c45c48e commit d23c819
Showing 1 changed file with 16 additions and 17 deletions.
33 changes: 16 additions & 17 deletions src/DryIoc/Container.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8162,16 +8162,11 @@ public static ParameterServiceInfo Of(ParameterInfo parameter)
: ServiceDetails.Of(ifUnresolved: IfUnresolved.ReturnDefault, defaultValue: parameter.DefaultValue));
}

/// <summary>The parameter type or dereferenced parameter type for `ref`, `in`, `out` parameters</summary>
public readonly Type DereferencedParameterType;

/// <summary>Service type specified by <see cref="ParameterInfo.ParameterType"/>.</summary>
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;

/// <summary>Optional service details.</summary>
public virtual ServiceDetails Details => ServiceDetails.Default;
Expand All @@ -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
{
Expand Down Expand Up @@ -8921,22 +8922,20 @@ public TResult Is<TResult>(
Func<FieldInfo, TResult> 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();
Expand Down

0 comments on commit d23c819

Please sign in to comment.