이미 존재하는 개체에 대해 deserialization 생성자를 호출하려고합니다. 표현식 나무로 어떻게 할 수 있습니까?기존 개체의 표현식 트리를 통해 생성자를 어떻게 호출합니까?
내가 시도 : 문제가 해결되지 않도록
// Create an uninitialized object
T graph = (T)FormatterServices.GetUninitializedObject(graphType);
// (graph, serializationInfo, streamingContext) => graph.Constructor(serializationInfo, streamingContext)
ParameterExpression graphParameter = Expression.Parameter(serializationPack.SelfSerializingBaseClassType, "graph");
ParameterExpression serializationInfoParameter = Expression.Parameter(typeof(SerializationInfo), "serializationInfo");
ParameterExpression streamingContextParameter = Expression.Parameter(typeof(StreamingContext), "streamingContext");
MethodCallExpression callDeserializationConstructor = Expression.Call(graphParameter,
(MethodInfo)serializationPack.SelfSerializingBaseClassType.GetConstructor(new[] { typeof(SerializationInfo), typeof(StreamingContext) }),
new[] { serializationInfoParameter, streamingContextParameter });
하지만 Expression.Call
만,하지 ConstructorInfo
MethodInfo
을 허용 - MethodInfo
로 변환하는 방법이 없다면?
업데이트
난 그냥 ConstructorInfo.Invoke
를 사용하여 eneded :
// Cache this part
ConstructorInfo deserializationConstructor = serializationPack
.SelfSerializingBaseClassType
.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.Standard,
new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null);
// Call this when I need it
deserializationConstructor.Invoke(graph, new Object[] { serializationInfo, new StreamingContext() });
나는 그것의 성능을 두려워하지만,이 작업을 수행 할 수있는 유일한 방법이 될 것으로 보인다.
업데이트
이 이제 적절한 대답을 가지고있다. 모두에게 감사드립니다.
"표현식 트리로 어떻게 할 수 있습니까?"정상적인 코드로는 표현식 트리로 할 수 없는데 왜 표현식 트리로 할 수 있다고 생각하십니까? – svick
기존 개체에서 생성자를 호출 하시겠습니까? 너 그렇게 할 수있어. 내가 뭔가를 놓치지 않는 한. – sircodesalot
내일 일부 코드가 생성됩니다. –