我正在製作一個工具來定義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;
}
你可以發佈更多一點的代碼?看起來你正在編寫一個序列化程序。如果我知道更多的代碼,我可以幫你解決這個問題。 –
注意:你已經嘗試了內置JSON序列化和第三方(如JSON.Net),由於某種原因沒有任何作用,你必須建立你自己的,對吧? –
我不寫一個序列化程序,即時通訊只是製作一個圖形用戶界面來*生成* JSON(使用JSON.net)。我試圖以一種方式編寫它,如果我們向「數據」項目添加新類型,我們不必修改此程序。不過,我發佈了更多的代碼。 –