2012-12-14 3 views
1

저는 REST 서비스를 테스트하기 위해 JSON으로 직렬화 할 수 있도록 WPF에서 객체를 정의하기위한 도구를 만들고 있습니다. 리플렉션을 사용하여 모든 속성을 GUI로 가져오고 입력을 기반으로 JSON을 생성합니다. 이것은 내가 정의한 유형의 배열 인 속성을 제외한 모든 것에 대해 환상적으로 작동합니다. 이를 수행하기 위해 object.InvokeMember() 메서드를 사용하고 있습니다.객체 []의 사용자 정의 유형 배열에 대한 런타임 캐스팅

문제는 매개 변수로 개체 배열을 전달해야한다는 것입니다. 그것의 단 한 가지, 그 괜찮아요,하지만 배열 때, 개체 배열이 속성이 유형에 캐스팅되지 않았기 때문에 그것은 예외를 throw합니다. 설명하기가 어렵습니다.

일부 코드 :

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

필자는 serializer를 쓰지 않고 GUI를 * generate * the JSON (JSON.net)으로 만든다. 우리가 "데이터"프로젝트에 새로운 유형을 추가하면이 프로그램을 수정하지 않아도되는 방식으로 작성하려고합니다. 그래도 좀 더 많은 코드를 게시하십시오. –

답변

2

당신이 개체에 대한 컬렉션의 모든 단일 요소를 주조 의미하는 경우 당신은 LINQ를 사용할 수 있습니다

list.Cast<object>().ToArray(); 
+0

아니, 모든 요소는 이미 내가 원하는대로, 배열 유형은 여전히 ​​개체 []입니다. 나는이 유형을 사용할 수 없습니다. [] –

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

이 작업은 효과가 없습니다. "ob"은 InvokeMember에 전달할 때 type = object {MyType []} 인 객체 배열이어야합니다. 그렇지 않으면 절대 작동하지 않습니다. 예제에서 1 : "ob"유형이 객체 {object []} 예 2입니다. 객체는 {List }입니다. 명확하게하기 위해, "ob"은 당신이 호출하는 Property의 타입과 일치해야한다. IT는 또한 객체가되어야합니다. [] 객체가 아닙니다. –