public Type Close(Type conversionPatternType, Type sourceType, Type targetType)
{
var @interface = conversionPatternType.GetInterface(typeof (IConversionPattern<,>));
if (@interface == null)
{
throw new ArgumentException(string.Format("Type {0} doesn't implement {1} and therefore is invalid for this operation.", conversionPatternType, typeof (IConversionPattern<,>)));
}
var arguments = @interface.GetGenericArguments();
var interfaceSourceType = arguments[0];
var interfaceTargetType = arguments[1];
if (conversionPatternType.IsGenericType == false)
{
if (sourceType.Is(interfaceSourceType) && targetType.Is(interfaceTargetType))
{
return conversionPatternType;
}
return null;
}
var openClassArguments = conversionPatternType.GetGenericArguments();
var parameters = new Type[openClassArguments.Length];
if (TryAddParameters(sourceType, interfaceSourceType, parameters, openClassArguments) == false)
{
return null;
}
if (TryAddParameters(targetType, interfaceTargetType, parameters, openClassArguments) == false)
{
return null;
}
if (parameters.Any(p => p == null))
{
return null;
}
return conversionPatternType.MakeGenericType(parameters);
}