我正在制作一个工具来定义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)。我试图以一种方式编写它,如果我们向“数据”项目添加新类型,我们不必修改此程序。不过,我发布了更多的代码。 –