Преобразовать System.Drawing.Color в System.Windows.Media.Color [дубликат]

Первоначально я использовал решение @Mrchief в течение многих лет (оно прекрасно работает). Но когда я добавил Swagger в свой проект для документации API, моей конечной точкой было НЕ .

Это заняло у меня некоторое время, но это то, что я придумал. Он работает с Swagger, и ваши сигнатуры методов API выглядят чище:

В конце вы можете сделать:

    // GET: /api/values/1,2,3,4 

    [Route("api/values/{ids}")]
    public IHttpActionResult GetIds(int[] ids)
    {
        return Ok(ids);
    }

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Allow WebApi to Use a Custom Parameter Binding
        config.ParameterBindingRules.Add(descriptor => descriptor.ParameterType == typeof(int[]) && descriptor.ActionDescriptor.SupportedHttpMethods.Contains(HttpMethod.Get)
                                                           ? new CommaDelimitedArrayParameterBinder(descriptor)
                                                           : null);

        // Allow ApiExplorer to understand this type (Swagger uses ApiExplorer under the hood)
        TypeDescriptor.AddAttributes(typeof(int[]), new TypeConverterAttribute(typeof(StringToIntArrayConverter)));

        // Any existing Code ..

    }
}

Создать новый класс: CommaDelimitedArrayParameterBinder.cs

public class CommaDelimitedArrayParameterBinder : HttpParameterBinding, IValueProviderParameterBinding
{
    public CommaDelimitedArrayParameterBinder(HttpParameterDescriptor desc)
        : base(desc)
    {
    }

    /// 
    /// Handles Binding (Converts a comma delimited string into an array of integers)
    /// 
    public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider,
                                             HttpActionContext actionContext,
                                             CancellationToken cancellationToken)
    {
        var queryString = actionContext.ControllerContext.RouteData.Values[Descriptor.ParameterName] as string;

        var ints = queryString?.Split(',').Select(int.Parse).ToArray();

        SetValue(actionContext, ints);

        return Task.CompletedTask;
    }

    public IEnumerable ValueProviderFactories { get; } = new[] { new QueryStringValueProviderFactory() };
}

Создать новый класс: StringToIntArrayConverter.cs

public class StringToIntArrayConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }
}

Примечания:

  • https://stackoverflow.com/a/47123965/862011 указали мне правильное направление
  • Swagger был только не удается выбрать конечные точки с разделителями-запятыми при использовании атрибута [Маршрут]

26
задан Ash Burlaczenko 25 February 2013 в 10:35
поделиться

2 ответа

Как насчет:

using MColor = System.Windows.Media.Color;
using DColor = System.Drawing.Color;
...

public static MColor ToMediaColor(this DColor color)
{
   return MColor.FromArgb(color.A, color.R, color.G, color.B);
}

РЕДАКТИРОВАТЬ: Исправлена ​​«распаковка» ARGB.

46
ответ дан 28 November 2019 в 06:59
поделиться
System.Windows.Media.Color mediaColor = System.Windows.Media.Color.FromRgb(Color.Red.R, Color.Red.G, Color.Red.B);
7
ответ дан 28 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: