WPFでオブジェクトを定義するためのツールを作成しているので、RESTサービスをテストするためにオブジェクトをJSONにシリアル化できます。リフレクションを使用してすべてのプロパティをGUIにプルし、入力に基づいてJSONを生成します。これは、私が定義した型の配列であるプロパティを除いて、すべてに対して素晴らしく機能します。私はobject.InvokeMember()
これを達成するためにこの方法を使用しています。
問題は、パラメータとしてオブジェクト配列を渡す必要があることです。オブジェクト配列がプロパティの型にキャストされていないため、1つだけの場合は問題ありませんが、配列の場合は例外がスローされます。これを説明するのは難しいです。
いくつかのコード:
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;
}