Как преобразовать значение аргумента Generic Type в конкретный тип?
Я пытаюсь преобразовать значение значения параметра T типового типа в целое число, убедившись, что T фактически является целым числом:
public class Test
{
void DoSomething<T>(T value)
{
var type = typeof(T);
if (type == typeof(int))
{
int x = (int)value; // Error 167 Cannot convert type 'T' to 'int'
int y = (int)(object)value; // works though boxing and unboxing
}
}
}
Хотя он работает через бокс и распаковку, это дополнительная служебная нагрузка, и я блуждал, если есть способ сделать это напрямую.
Ответы
Ответ 1
Бокс и распаковка будут, пожалуй, самым эффективным способом здесь. Я не знаю, каким образом можно избежать появления бокса, и любая другая форма преобразования (например, Convert.ToInt32) потенциально будет выполнять конверсии, которые вам действительно не нужны.
Ответ 2
Convert.ToInt32(value);
Должно это сделать.
Ответ 3
int и другие примитивы CLR реализуют IConvertible.
public class Test
{
void DoSomething<T>(T value) where T : IConvertible
{
var type = typeof(T);
if (type == typeof(int))
{
int y = value.ToInt32(CultureInfo.CurrentUICulture);
}
}
}
Ответ 4
int x = (dynamic)MyTest.Value;
Я знаю, что это очень старый поток, но это реальный способ сделать это. (dynamic)
преобразует значение T в любой из примитивных известных типов во время выполнения.
Ответ 5
См. мой ответ на другое сообщение: fooobar.com/questions/465587/.... Он содержит эффективную реализацию класса, которая позволяет избежать бокса во время преобразования.
Ответ 6
int id = (dynamic)myobject.SingleOrDefault();
ИЛИ
int id = (int)myobject.SingleOrDefault();
Это помогло мне получить значение int
. Здесь myobject
имеет значение ObjectResult<Nullable<int>>
.
Ответ 7
Следующий способ должен работать.
int x = (int)(value as int?);