2012-12-14 55 views
1

我正在製作一個工具來定義WPF中的對象,以便它們可以序列化爲JSON以測試我們的REST服務。它使用反射將所有屬性拉入GUI中,並根據輸入生成JSON。這非常適用於除了我定義的類型數組的屬性之外的所有內容。我正在使用object.InvokeMember()方法來完成此操作。運行時將對象[]轉換爲自定義類型數組

問題是,您必須將它作爲參數傳遞給一個對象數組。當它只是一件事情時,它很好,但是當它是一個數組時,它會拋出一個異常,因爲對象數組不會被轉換爲屬性所屬的類型。這很難解釋。

一些代碼:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    object obj = new MyType(); 
    List<list<object>> list = new List<List<object>>(); 
    object[] ob = new object[] { list.ToArray() }; 
    obj.GetType().InvokeMember(
     "MyOtherTypes", 
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
     Type.DefaultBinder, 
     obj, 
     ob); 
    UpdateJson(obj); 
} 

public class MyType 
{ 
    public MyOtherType[] MyOtherTypes { get; set; } 
} 

public class MyOtherType 
{ 
    public int SomeProperty { get; set; } 
} 

我相信誰讀這會混淆,所以請提問。

更多代碼,修改非數組類型的示例。這部分工作正常:

object[] ob = new object[] { obj }; 
obj.GetType().InvokeMember(
    "SomePropertyThatIsNotAnArray", 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
    Type.DefaultBinder, 
    obj, 
    ob); 
UpdateJson(obj); 

一直在努力這樣的事情,但同樣的協議,傾斜鑄造工件[]來的MyType []

MethodInfo castMethod = this.GetType().GetMethod("Cast").MakeGenericMethod(
    obj.GetType().MakeArrayType()); 
object castedObject = castMethod.Invoke(
    null, 
    new object[] { list[someIndex].ToArray() }); 
obj.GetType().InvokeMember(
    "SomePropertyThatIsNotAnArray", 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
    Type.DefaultBinder, 
    obj, 
    castedObject); 

public static T Cast<T>(object o) 
{ 
    return (T)o; 
} 
+0

你可以發佈更多一點的代碼?看起來你正在編寫一個序列化程序。如果我知道更多的代碼,我可以幫你解決這個問題。 –

+0

注意:你已經嘗試了內置JSON序列化和第三方(如JSON.Net),由於某種原因沒有任何作用,你必須建立你自己的,對吧? –

+0

我不寫一個序列化程序,即時通訊只是製作一個圖形用戶界面來*生成* JSON(使用JSON.net)。我試圖以一種方式編寫它,如果我們向「數據」項目添加新類型,我們不必修改此程序。不過,我發佈了更多的代碼。 –

回答

2

如果你的意思是鑄造集合對象的每一個元素你可以使用LINQ:

list.Cast<object>().ToArray(); 
+0

nope,所有的元素已經是我想要它們了,數組類型仍然是我不能投射到mytype []的對象[] –

0

好像你只是做一個小的太多鑄造......任何[]object :)

更改頂部代碼這個...

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    object obj = new MyType(); 
    List<object> list = new List<object>(); 
    list.Add(obj); 
    foreach (object o in obj in list){ 
    obj.GetType().InvokeMember(
     "MyOtherTypes", 
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
     Type.DefaultBinder, 
     obj, 
     ob); 
    UpdateJson(obj); 
    } 
} 

它真的需要一個List然後就做這個

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    object obj = new MyType(); 
    List<list<object>> list = new List<List<object>>(); 
    object ob = (object) list; 
    obj.GetType().InvokeMember(
     "MyOtherTypes", 
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
     Type.DefaultBinder, 
     obj, 
     ob); 
    UpdateJson(obj); 
} 
+0

這是行不通的。當你將它傳遞給InvokeMember時,「ob」必須是一個type = object {MyType []}的對象數組,否則絕對不會工作。 在您的示例1中:「ob」的類型是object {object []} 示例2它是object {List }。爲了澄清,「ob」必須匹配您所調用的屬性的類型(如果它是您所調用的屬性)。 IT也必須是一個對象,而不僅僅是一個對象 –

相關問題