2017-03-01 3 views
2

저는 PreProd와 Prod를위한 두 개의 URL 집합을 가지고 있습니다. 각 URL에는 여러 개의 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 이름을 전달하고 API URL을 반환합니다.

GettexApiUrlBasedOnEnvironment("Dev", "precheckorder"); 

및 응답 등의

뭔가

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

모든 아이디어/제안이 많이 이해할 수있을 것이다 것입니다. TIA는

+0

당신이하려는 일이 명확하지 않습니다. 메서드를 반환하려는 경우 입력 매개 변수가 열거 형이고 메서드 내에서 논리를 수행하는 오버로드가있는 메서드가 두 개 있습니다 (예 : 'MyMethod (EnumType1 en)'및 'MyMethod (EnumType2 en) '). 또한 Gettex ...라는 단어에서 "Dev"라는 단어를 볼 수는 있지만 질문의 다른 곳에서는 볼 수 없습니다. 릴리스/디버그 모드에서 실행 중인지 여부에 따라 결과를 변경하려고합니까? 그렇다면 '#if DEBUG'를 사용하고 프로그램이로드 될 때 약간의 로직을 넣으십시오. '반사'태그는 무엇입니까? – beeker

답변

2

그냥 같이, 하나 사전에 URL을 저장 :

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의없이 을 시도, \의 경우, 스위치 등

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!"를 받게됩니다를 호출하여

.