1

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;
}
4

2 に答える 2

2

コレクションのすべての要素をオブジェクトにキャストする場合は、LINQ を使用できます。

list.Cast<object>().ToArray();
于 2012-12-14T17:10:49.193 に答える
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);
}
于 2012-12-14T19:30:17.040 に答える