Любой способ получить тип Tuple <> item (s) - PullRequest
3 голосов
/ 29 февраля 2012

где значение по умолчанию

IEnumerable<Tuple<string, double>> GetValues()
{
   ....
       yield return new Tuple<string,double>(dataRow["<field>"].ToString(),
               (double)Convert.ChangeType(dataRow["<field>"], typeof(double)));
   ....

   // and more code similar to above based on other custom logic

}

как вы можете видеть, это много удвоения / принуждения он все еще может измениться на строку или на другие типы данных

интересно, есть ли способ получить типы данных Tuple, определенные в сигнатуре, чтобы я мог создать некоторый универсальный помощник и не беспокоиться о том, чтобы пропустить какое-то преобразование где-то

Это должно быть возможно с отражением? я надеюсь!

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Если это класс DataRow , у вас есть хороший метод расширения, который называется Поле .

IEnumerable<Tuple<T1, T2>> GetValues<T1, T2>(String field1, String field2)
{
   ....
       yield return new Tuple<T1,T2>(dataRow.Field<T1>("<field>"),
               dataRow.Field<T2>("<field>"));
   ....
}
2 голосов
/ 29 февраля 2012

Если у вас есть экземпляр Tuple, вы можете получить параметры универсального типа через отражение:

var x = Tuple.Create<int, string>(0, "test");
var y = x.GetType().GetGenericArguments();
y[0].Name = "System.Int32";

Вы можете получить эту же информацию во время компиляции, используя "typeof ()", или во время выполнения.используя отражение, вот так:

public Tuple<string, double> DoSomething()
{
  var y = typeof(Tuple<string, double>).GetGenericArguments();
  var z = MethodBase.GetCurrentMethod().ReturnType.GetGenericArguments();
}

Я не думаю, что это действительно поможет вам;Вы не можете связать информацию о типе, полученную во время выполнения, с общими параметрами в типе компиляции, поэтому вы не экономите много времени.Вам все равно придется указывать где-то несколько раз типы данных.

Ответ Криса Шейна (метод Field<T>) действительно является подходящим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...