我正在制作一个用于在 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);
一直在尝试这样的事情,但同样的交易,不能将 object[] 转换为 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;
}