2009-09-23 16 views
7

mam ten dokument XMLJak dynamicznie rzutować obiekt typu ciąg do obiektu typu T

<AdditionalParameters> 
<PublishToPdf Type ="System.Boolean">False</PublishToPdf> 
</AdditionalParameters> 

w moim kodu i usiłuję zbudować tablicę argumentów zawierających węzeł <PublishToPdf>.

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText); 

To oczywiście psuje czas kompilacji. Nie mogę obliczyć, jak rzutować publishNode.InnerText('false') do zdefiniowanego obiektu runtime typu określonego w pliku XML i zapisać go w obiekcie (który zachowa typ).

Odpowiedz

19

Można użyć Convert.ChangeType:

object value = Convert.ChangeType(stringValue, destinationType); 
+0

Wielkie dzięki, wszystko działało dobrze. – LolaRun

+0

Tak, aby uzyskać parametr destinationType, należy użyć var destinationType = Type.Parse (publishNode.Attributes ["Type"]. Value); – Digitalex

+0

Type.Parse() wydaje się nie istnieć. Czy miałeś na myśli Type.GetType() przez przypadek? –

2

Nie możesz zrobić dokładnie tego, co próbujesz zrobić. Po pierwsze, słowo kluczowe typeof nie pozwala na dynamiczną ocenę w środowisku wykonawczym. Istnieją sposoby, dzięki którym można to zrobić za pomocą odbicia, przy użyciu metod takich jak Type.GetType(string), ale obiekty Type zwrócone z tych funkcji odbijających nie mogą być używane do operacji takich jak rzutowanie.

Co należy zrobić, to podać sposób przekształcania typu do i od reprezentacji ciągów znaków. Nie ma automatycznej konwersji z dowolnego typu. Na przykład można użyć bool.Parse lub bool.TryParse, ale są one specyficzne dla typu bool. Istnieją podobne metody na większości typów pierwotnych.

+0

Przejście przez sznurek mi pomogło. – Slion

1

Proste rozwiązanie, zakładając, że istnieje ograniczona liczba możliwych typów;

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); 
+0

Pracuję z .NET Framework 2.0. i nie mam var. Rozwiązaniem, które zaproponowałeś, jest fabryka realizująca tworzenie obiektów wszelkiego rodzaju, które są niezliczone. Ale dzięki za twoją pomoc. – LolaRun

+0

Cóż, var był tylko po to, aby kod był krótszy, zamiast tego możesz użyć ciągu, ciągu znaków, obiektu dla tych trzech. I, jak już powiedziałem, jeśli potrzebujesz tylko wsparcia ograniczonej liczby typów, to działałoby dobrze. Jeśli nie, to masz rację, mówiąc, że to nie jest praktyczne. – Digitalex

+1

W C# 6 można użyć na przykład 'case nameof (System.Guid):'. Nie ma już potrzeby ciągów stałych. nameof jest generowany czas kompilacji. –

Powiązane problemy