private ParametersVersionAttribute(Type versionConverterType) { if (!typeof(IParametersVersionConverter).IsAssignableFrom(versionConverterType)) { throw new InvalidCastException( $"{versionConverterType.FullName} must implement {typeof(IParameterConverter).FullName}"); } VersionConverter = (IParametersVersionConverter)Activator.CreateInstance(versionConverterType); }
private void ConvertParameters(Type paramsType, Version paramVersion, Action <IParameterConverter> converter) { IParametersVersionConverter versConv = null; var curParamVersion = new Version(); paramsType.TryGetAttribute <ParametersVersionAttribute>(a => { versConv = a.VersionConverter; curParamVersion = a.Version; }); if (curParamVersion != paramVersion) { if (curParamVersion > paramVersion) { if (versConv != null) { if (versConv.ContainsKey(curParamVersion)) { foreach (var conv in versConv.Where( v => v.Key > paramVersion && v.Key <= curParamVersion) .OrderBy(v => v.Key)) { converter.Invoke(conv.Value); } } else { throw new NullReferenceException($"{curParamVersion} version of parameters {paramsType.FullName} is not registered"); } } else { throw new NullReferenceException("Version converter is not set"); } } else { throw new FutureVersionParametersException(paramsType, curParamVersion, paramVersion); } } }