2012-12-14 54 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也必须是一个对象,而不仅仅是一个对象 –

相关问题