Компилятор испускает больше 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 и другие стоятся.
Вы можете использовать Convert.ChangeType
:
object value = Convert.ChangeType(stringValue, destinationType);
Вы не можете делать именно то, что пытаетесь сделать. Во-первых, ключевое слово typeof
не позволяет выполнять динамическую оценку во время выполнения. Существуют средства, позволяющие сделать это с помощью отражения, с такими методами, как Type.GetType (string)
, но объекты Type
, возвращаемые этими отражательными функциями, не могут использоваться для таких операций, как приведение
Что вам нужно сделать, так это предоставить средства преобразования вашего типа в строковое представление и обратно. Автоматического преобразования из любого произвольного типа нет. В вашем примере вы можете использовать bool.Parse
или bool.TryParse
, но они относятся только к типу bool
. Подобные методы существуют для большинства примитивных типов.
Простое решение, предполагающее ограниченное количество возможных типов;
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);