2014-01-09 2 views
1

У меня есть код, подобный этому:Как это сделать в C# с использованием дженериков

int GetIntValue(string name) 
{ 
     string valueString=GetValue(name); 
     int value=int.Parse(valueString); 
     return value; 
} 
double GetDoubleValue(string name) 
{ 
     string valueString=GetValue(name); 
     double value=double.Parse(valueString, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture); 
     return value; 
} 

и аналогичный код для другого типа числового типа.

Я хочу написать что-то такое, как это:

T getValue<T>(string name) 
    { 
     string valueString=GetValue(name); 
     T value=T.Parse(valueString, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture); 
     return value; 
    } 

Но он не работает (T является слишком общим). Как изменить этот код, чтобы использовать generic в C#?

Я использую .NET 4.

редактировать

коды неподвижных удалить опечатки.

+0

здесь что-то интересное: http://answers.yahoo.com/question/index?qid=20111020084257AAtB8qA – wudzik

+0

Поскольку первая строка такая же, вы на самом деле спрашиваете, как вызвать Parse без предоставления конкретного типа, но ожидайте, что результат будет конкретным типом? Даже если бы вы могли, вам все равно пришлось бы передать аргумент типа, например 'getValue (value)'. Почему бы просто не называть 'double.ToParse' в первую очередь? –

+0

Вы будете торговать несколькими функциями с общим с помощью типа 'switch/case' внутри (на самом деле не одного, но своего рода), где вы должны проверять * все типы *, которые имеют уникальный' Parse' (или, возможно, если вы можете сами разобрать их) и назовите его для этого типа. Другая возможность может быть отражением, когда вы проверяете, имеет ли этот тип метод 'Parse' и каким-то образом его называют. – Sinatr

ответ

8

Вы можете использовать Convert.ChangeType если T реализует IConvertible:

T getValue<T>(string name) where T : IConvertible 
{ 
    string valueString=GetValue(string); 
    T value = (T)Convert.ChangeType(valueString, typeof(T)); 
    return value; 
} 
+0

А, я просто это увидел. Ничего ... – TylerD87

+0

В моем коде у меня есть: value = int.TryParse (valueString, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture); Чтобы убедиться, что локальная культура не влияет на результат анализа. Как я могу это сделать с помощью этого метода? – mans

+0

Вы можете передать 'CultureInfo.InvariantCulture' в качестве третьего параметра. Если вам действительно нужно 'Any' (в отличие от значения по умолчанию [' Integer'] (http://msdn.microsoft.com/en-us/library/system.globalization.numberstyles (v = vs.110) .aspx)), Я не уверен ... может быть, вы могли бы создать это в 'IFormatProvider', который вы пишете, или, может быть, вам нужно просто обработать' int' (и любые другие типы, где вы можете указать нестандартный ' NumberStyles') в качестве специального случая. –

3

Вопросы - как иметь один общий метод для синтаксического анализа int и double right? В методах вопроса есть string valueString = GetValue (string);, вероятно, опечатка, так это значение приобретают

так, чтобы соответствовать этому вопросы этот метод должен выглядеть

private T Read<T>(string name) 
      { 
       string valueString=GetValue(name); 
       TypeConverter converter = TypeDescriptor.GetConverter(typeof (T)); 
         try 
         { 
          return (T) converter.ConvertFromString(value); 
         } 
         catch (FormatException) 
         { 
          return default(T); 
         } 

      } 
+1

Как это ответ? – wudzik

+0

WTF с вами, ребята, что не так в ответ? вопрос в том, как сделать один метод, так что здесь не так? –

+3

Возможно, вам стоит добавить объяснение? Это не строгий ответ. И BTW с использованием аббревиатур не означает, что 'F' не то, что это – wudzik

Смежные вопросы