저는 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;
}
을 할 필요가 있겠습니까? 당신이 시리얼 라이저를 쓰고있는 것처럼 보입니다. 좀 더 많은 코드를 알고 있다면이 코드를 사용하여 도움을받을 수 있습니다. –
사이드 노트 : JSON 직렬화와 타사 (JSON.Net과 같은)를 모두 사용해 보았습니다. 어떤 이유로 든 아무것도 작동하지 않으며 자신을 직접 구축해야합니다. –
필자는 serializer를 쓰지 않고 GUI를 * generate * the JSON (JSON.net)으로 만든다. 우리가 "데이터"프로젝트에 새로운 유형을 추가하면이 프로그램을 수정하지 않아도되는 방식으로 작성하려고합니다. 그래도 좀 더 많은 코드를 게시하십시오. –