2017-03-01 47 views
2

我有两组Url,一个用于PreProd,一个用于Prod。每个Url都有几个API节点。而不是硬编码这些API节点,我保持他们在一个枚举从字符串方法名称调用方法

事情是这样的:

//Prod 
private enum Prod 
{ 
    precheckorder, 
    submitresubmit, 
    creditInquiry, 
    createupdateorder, 
    confirmorder, 
    getorderstatus, 
    cancelorder, 
} 

/// <summary> 
/// Gets the relative URL. 
/// </summary> 
/// <param name="u">The u.</param> 
/// <returns></returns> 
/// <exception cref="Exception"></exception> 
private static string GetRelativeUrl(Prod u) 
{ 
    switch (u) 
    { 
     case Prod.precheckorder: 
      return "https://contesa.tex.com/api/precheckorder"; 
     case Prod.submitresubmit: 
      return "https://contesa.tex.com/api/submitresubmit"; 
     case Prod.creditInquiry: 
      return "https://contesa.tex.com/api/creditinquiry"; 
     case Prod.createupdateorder: 
      return "https://contesa.tex.com/api/createupdateorder"; 
     case Prod.confirmorder: 
      return "https://contesa.tex.com/api/confirmorder"; 
     case Prod.getorderstatus: 
      return "https://contesa.tex.com/api/getorderstatus"; 
     case Prod.cancelorder: 
      return "https://contesa.tex.com/api/cancelorder"; 
     default: 
      // Handle bad URL, possibly throw 
      throw new Exception(); 
    } 
} 

我们使用环境变量来存储环境的名字和那是什么决定了要使用的API集。

理想情况下,我想要一个方法,我传入我的环境和API名称,它将返回API Url。

喜欢的东西

GettexApiUrlBasedOnEnvironment("Dev", "precheckorder"); 

和响应将是

"https://contoso.tex.com/api/precheckorder" 

任何意见/建议,我们将不胜感激。 TIA

+0

目前尚不清楚你想要做什么。如果你只是想要返回一个方法,那么只需要两个带重载的方法,其中输入参数是枚举类型并执行方法内的逻辑(例如'string MyMethod(EnumType1 en)'和'string MyMethod(EnumType2 EN)“)。另外,我在您展示的Gettex ...方法中看到“Dev”一词,但在问题的其他地方没有。你只是试图根据你是否在release/debug模式下运行来改变结果吗?如果是这样,只需使用'#if DEBUG'并在程序加载时放入一些逻辑。什么是'反射'标签? – beeker

回答

2

只储存你的网址,在一个字典,像这样:

public enum ApiType 
{ 
    precheckorder, 
    submitresubmit, 
    creditInquiry, 
    createupdateorder, 
    confirmorder, 
    getorderstatus, 
    cancelorder, 
} 

public enum EnvironmentType { 
    Dev, 
    Prod 
} 

public static string GettexApiUrl(ApiType apiType) { 
    var envRaw = Environment.GetEnvironmentVariable("YourVariable"); 
    EnvironmentType env; 
    if (!Enum.TryParse(envRaw, out env)) 
     throw new Exception("Invalid environment provided in environment variable YourVariable: " + envRaw); 
    return GettexApiUrlBasedOnEnvironment(env, apiType); 
} 

public static string GettexApiUrlBasedOnEnvironment(EnvironmentType env, ApiType apiType) { 
    if (!_urls.ContainsKey(env)) 
     throw new Exception("Invalid environment " + env); 
    var url = _urls[env]; 
    if (!url.ContainsKey(apiType)) 
     throw new Exception("Invalid api type " + apiType); 
    return url[apiType]; 
} 

private static readonly Dictionary<EnvironmentType, Dictionary<ApiType, string>> _urls = new Dictionary<EnvironmentType, Dictionary<ApiType, string>>(
    ) { 
    {EnvironmentType.Dev, new Dictionary<ApiType, string>() { 
     {ApiType.precheckorder, "https://contoso.tex.com/api/precheckorder"}, 
     // etc 
    } }, { 
     EnvironmentType.Prod, new Dictionary<ApiType, string>() { 
     {ApiType.precheckorder, "https://contesa.tex.com/api/precheckorder"}, 
    }}, 
}; 
+0

美妙而优化的解决方案!!!!! – csharpbd

1

尝试下面的代码,没有额外词典,enum S,开关\案例等

private static string GettexApiUrlBasedOnEnvironment(string envType, string api) 
{ 
      string env = envType.Equals("Dev") ? "contoso" : "contesa"; 
      return $"http://{env}.tex.com/api/{api}"; 
} 

它很简单,在新API的情况下不需要维护。

1

您也可以使用反射,而利用这样的字符串表示获得枚举的类型和值:

using System; 
using System.Reflection; 

namespace EnumGames 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      SomeClass sc = new SomeClass(); 
      var ans = sc.GetEnumValue("MyEnum", "OptionB"); 
     } 
    } 

    public class SomeClass 
    { 
     public enum MyEnum 
     { 
      OptionA, 
      OptionB, 
      OptionC 
     } 
     public enum MyOtherEnum 
     { 
      OptionA, 
      OptionB, 
      OptionC 
     } 
     public string GetEnumValue(string enumNameString, string enumOptionString) 
     { 
      var assembly = Assembly.GetExecutingAssembly(); 
      var enumType = assembly.GetType($"{this.ToString()}+{enumNameString}"); 
      var enumOption = Enum.Parse(enumType, enumOptionString); 
      return GetEnumValue(enumOption); 
     } 
     private string GetEnumValue(object enumOption) 
     { 
      if (enumOption is MyEnum) 
      { 
       switch ((MyEnum)enumOption) 
       { 
        case MyEnum.OptionA: 
         return "Hi"; 
        case MyEnum.OptionB: 
         return "Hello"; 
        case MyEnum.OptionC: 
         return "Yo"; 
        default: 
         return "Nope"; 
       } 
      } 
      else if (enumOption is MyOtherEnum) 
      { 
       switch ((MyOtherEnum)enumOption) 
       { 
        case MyOtherEnum.OptionA: 
         return "Bye"; 
        case MyOtherEnum.OptionB: 
         return "Ta-Ta!"; 
        case MyOtherEnum.OptionC: 
         return "Goodbye"; 
        default: 
         return "Nopee"; 
       } 
      } 
      return "Nooope"; 
     } 
    } 
} 

在上面的例子中,GetEnumValue()接收枚举名称和选项,将其转换为一个真正的枚举选项,然后使用另一种方法来获得所需的值。

所以,通过调用

GetEnumValue("MyEnum", "OptionB"); 

我会收到字符串"Hello"

,并通过调用

GetEnumValue("MyOtherEnum", "OptionB"); 

我会收到字符串"Ta-Ta!"

相关问题