Как динамично бросить объект строки типа к объекту типа T

Компилятор испускает больше IL при обертывании кода в блоке попытки/выгоды; Посмотрите для следующей программы:

using System;
public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("abc");
    }
}

компилятор испустит этот IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "abc"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Program::Main

, В то время как для немного измененной версии:

using System;
public class Program
{
    static void Main(string[] args)
    {
        try { Console.WriteLine("abc"); }
        catch { }
    }
}

испускает больше:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       23 (0x17)
  .maxstack  1
  IL_0000:  nop
  .try
  {
    IL_0001:  nop
    IL_0002:  ldstr      "abc"
    IL_0007:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000c:  nop
    IL_000d:  nop
    IL_000e:  leave.s    IL_0015
  }  // end .try
  catch [mscorlib]System.Object 
  {
    IL_0010:  pop
    IL_0011:  nop
    IL_0012:  nop
    IL_0013:  leave.s    IL_0015
  }  // end handler
  IL_0015:  nop
  IL_0016:  ret
} // end of method Program::Main

Все эти NOPs и другие стоятся.

8
задан LolaRun 9 December 2014 в 01:04
поделиться

3 ответа

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

object value = Convert.ChangeType(stringValue, destinationType);
23
ответ дан 3 November 2019 в 14:19
поделиться

Вы не можете делать именно то, что пытаетесь сделать. Во-первых, ключевое слово typeof не позволяет выполнять динамическую оценку во время выполнения. Существуют средства, позволяющие сделать это с помощью отражения, с такими методами, как Type.GetType (string) , но объекты Type , возвращаемые этими отражательными функциями, не могут использоваться для таких операций, как приведение

Что вам нужно сделать, так это предоставить средства преобразования вашего типа в строковое представление и обратно. Автоматического преобразования из любого произвольного типа нет. В вашем примере вы можете использовать bool.Parse или bool.TryParse , но они относятся только к типу bool . Подобные методы существуют для большинства примитивных типов.

2
ответ дан 3 November 2019 в 14:19
поделиться

Простое решение, предполагающее ограниченное количество возможных типов;

object GetValueObject(string type, string value)
{
  switch (type)
  {
    case "System.Boolean":
      return Boolean.Parse(value);
    case "System.Int32":
      return Int32.Parse(value);
    ...
    default:
      return value;
  }
}  

var type = publishNode.Attributes["Type"].value;
var value = publishNode.InnerText;
var valueObject = GetValueObject(type, value);
2
ответ дан 3 November 2019 в 14:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: