2013-07-14 1 views
0

Я ищу лучший способ реализовать метод, который ведет себя по-разному в соответствии с аргументом типа (я не могу использовать динамический здесь).Метод, который ведет себя по-разному с помощью некоторых аргументов типа

public class Methods 
{ 
    public int someMethod1() { return 1; } 
    public string someMethod2() { return "2"; } 

    public ??? process(System.Type arg1) ??? 
    { 
     if (arg1 is of type int) ?? 
      return someMethod1(); 
     else if (arg1 is of type string) ?? 
      return someMethod2(); 
    } 
} 

Если мой пример не ясно, вот моя реальная потребность:
- Пользователь моей Lib может указать, какой тип возвращения он хочет от его просьбы,
- В зависимости от типа спросил, я должен использовать другой набор методов (например, GetValueAsInt32() или GetValueAsString())

Большое спасибо!

ответ

0

Для заинтересованных приятелями, я искал вокруг много, и я придумал решение с использованием дженериков и отражения :

  • конвертирования общий метод:
public static class MyConvertingClass 
{ 
    public static T Convert<T>(APIElement element) 
    { 
     System.Type type = typeof(T); 
     if (conversions.ContainsKey(type)) 
      return (T)conversions[type](element); 
     else 
      throw new FormatException(); 
    } 

    private static readonly Dictionary<System.Type, Func<Element, object>> conversions = new Dictionary<Type,Func<Element,object>> 
    { 
     { typeof(bool), n => n.GetValueAsBool() }, 
     { typeof(char), n => n.GetValueAsChar() }, 
     { typeof(DateTime), n => n.GetValueAsDatetime() }, 
     { typeof(float), n => n.GetValueAsFloat32() }, 
     { typeof(double), n => n.GetValueAsFloat64() }, 
     { typeof(int), n => n.GetValueAsInt32() }, 
     { typeof(long), n => n.GetValueAsInt64() }, 
     { typeof(string), n => n.GetValueAsString() } 
    }; 
} 
  • Основной метод:
public static main() 
{ 
    // Defined by the user: 
    Type fieldType = typeof(double); 

    // Using reflection: 
    MethodInfo method = typeof(MyConvertingClass).GetMethod("Convert"); 
    method = method.MakeGenericMethod(fieldType); 

    Console.WriteLine(method.Invoke(null, new object[] { fieldData })); 
} 
1

Что делать, если вы просто использовать Generic, чтобы потребители могли определить тип возвращаемого значения:

public T process<T>(Type arg1) {...} 
+0

Это не может работать как в теле метода я не могу возвращать тип arg1 к Т – roboch

+0

я могу решить мою проблему с набором, если/иначе, если заявление но если я это сделаю, я не буду обобщать это решение на всю библиотеку и поэтому получит много повторяющихся последовательностей (чего я не хочу). – roboch

+0

Вы правы. В случае поддержки дженериков здесь вам нужно будет добавить ограничение на то, что T является классом, чтобы привести результат к T. другой вариант - вернуть объект и сделать несколько общедоступных методов, которые будут поддерживать возвращаемые базовые типы, такие как int, string, decimal и т. Д. , –