Альтернатива Enum для передачи из ограниченного списка значений - PullRequest
1 голос
/ 11 декабря 2011

Я работаю с веб-сервисом, предоставляемым компанией ERP (веб-сервис Infor SyteLine 8). Веб-сервис позволяет вам передавать продукты в систему ERP, передавая DataTable с DataRow, полным строк значений, которые входят в Item. Многие передаваемые значения поступают из ограниченного списка.

Сначала я попытался решить проблему с ограниченным списком, используя Enums для этих значений. К сожалению, многие вещи, для которых мне понадобится использовать Enums, не будут соответствовать типу Enums, потому что они имеют имена типа «KANBAN / JIT» или «040», которые не будут работать в Enum.

Причина, по которой я попытался использовать Enums, заключается в том, что я создал в своем коде объект продукта POCO, который я передаю, присваиваю значения и затем передаю их в веб-службу, объединяя ее в DataRow строк в DataTable. Таким образом, легко убедиться, что я устанавливаю значения в соответствии с тем, что существует, например product.productionType = productionTypeEnum.KANBANJIT;.

Какие у меня есть другие варианты, кроме использования Enums, чтобы у меня не возникало проблем?

1 Ответ

1 голос
/ 11 декабря 2011

Вы можете использовать перечисления, вам просто нужен какой-то метод, чтобы преобразовать их в строку перед добавлением их в DataRow.Например, преобразователь может быть реализован как метод расширения:

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

public class Product
{
  public enum ProductionType
  {
    Unknown,
    KanbanJit,
    ZeroForty
  }

  private ProductionType type;

  public ProductionType Type
  {
    get { return this.type; }
    set { this.type = value; }
  }

  // ... other members of Product class ...
}

public static class ExtensionMethods
{
  public static string ToString(this Product.ProductionType productionType)
  {
    switch (productionType)
    {
      case Product.ProductionType.KanbanJit: return "KANBAN/JIT";
      case Product.ProductionType.ZeroForty: return "040";
      default: return string.Empty;
    }
  }
}

public class Program
{
  public static void Main()
  {
    // Create products, set their production type, and add them to a list
    var products = new List<Product>();
    products.Add(new Product() { Type = Product.ProductionType.KanbanJit });
    products.Add(new Product() { Type = Product.ProductionType.ZeroForty });

    // Convert the production types to string and add them to DataRow
    foreach (var product in products)
      AddProductionTypeToDataRow(product.Type.ToString());    
  }

  static void AddProductionTypeToDataRow(string productionType)
  {
    // ... implementation comes here ...
    Console.WriteLine(productionType);
  }
}

== ОБНОВЛЕНИЕ ==

Вот еще одно безопасное для типов решение без метода расширения:

using System;
using System.Collections.Generic;

public class Product
{
  public sealed class ProductionType
  {
    private string name;
    private ProductionType(string name = null) { this.name = name; }
    public static implicit operator string(ProductionType type) { return type.name; }
    public static readonly ProductionType KanbanJit = new ProductionType("KANBAN/JIT");
    public static readonly ProductionType ZeroForty = new ProductionType("040");
    // ... other constants ...
    public static readonly ProductionType Unknown = new ProductionType();
  }

  private ProductionType type;

  public ProductionType Type
  {
    get { return this.type; }
    set { this.type = value; }
  }

  // ... other members of Product ...
}

public class Program
{
  public static void Main()
  {
    // Create products, set their production type, and add them to a list
    var products = new List<Product>();
    products.Add(new Product() { Type = Product.ProductionType.KanbanJit });
    products.Add(new Product() { Type = Product.ProductionType.ZeroForty });

    // Convert the production types to string and add them to DataRow
    foreach (var product in products)
      AddProductionTypeToDataRow(product.Type);    
  }

  static void AddProductionTypeToDataRow(string productionType)
  {
    // ... implementation comes here ...
    Console.WriteLine(productionType);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...