문제가 발생하여 해결 방법이 간단한 지 궁금합니다.리스트 <string>을 직렬화하고 각 문자열을 xml 노드로 사용하십시오.
여기 몇 가지 속성과 값을 정의하는 XML 템플릿이 있습니다. 나는이 내용을 알 수 없기 때문에
<Items>
<ID>10000</ID>
<Name>
<FirstName>Foo</FirstName>
<LastName>Bar</LastName>
</Name>
</Items>
같은
<Properties>
<Property name="ID">10000</Property>
<Property name="Name">
<SubProperty name="FirstName">Foo</SubProperty>
<SubProperty name="LastName">Bar</SubProperty >
</Property>
</Properties>
모든
은 모든 값이 부착과 함께, 새로운 XML 파일을 생성 템플릿에 정의 된 속성/하위 속성을 추출하는 것입니다 내가 뭔가 템플릿을 디자인 타임에로드하려고 시도하고 LINQ를 사용하는 List 클래스를 만들었지 만 직접 직렬화 할 때 위 결과를 얻을 수 없습니다. 따라서 List 클래스를 만드는 대신 Reflection.Emit을 사용하여 동적 객체를 만든 다음 객체를 XML에 직렬화합니다.private static readonly XDocument doc = XDocument.Load("Template.xml");
static void Main(string[] args) {
var newType = CreateDynamicType();
var newObject = Activator.CreateInstance(newType);
var properties = newType.GetProperties();
foreach (var property in properties) {
// assign values
}
SerializeToXml(newObject);
}
private static Type CreateDynamicType() {
AssemblyName assemblyName = new AssemblyName() { Name = "DynamicTypeAdapter" };
AssemblyBuilder assembly =
Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder module =
assembly.DefineDynamicModule(assembly.GetName().Name, false);
TypeBuilder type = module.DefineType("Items", TypeAttributes.Public | TypeAttributes.Class);
foreach (var p in doc.Descendants("Property")) {
string pName = p.Attribute("name").Value;
TypeBuilder subType = module.DefineType(pName, TypeAttributes.Public | TypeAttributes.Class);
foreach (var sp in p.Descendants("SubProperty")) {
CreateDynamicProperty(subType, sp.Attribute("name").Value, typeof(string));
}
var propertyType = subType.CreateType();
CreateDynamicProperty(type, pName, propertyType);
}
return type.CreateType();
}
private static void CreateDynamicProperty(TypeBuilder typeBuilder, string propertyName, Type propertyType) {
PropertyBuilder property = typeBuilder.DefineProperty(propertyName,
PropertyAttributes.None, propertyType, new Type[] { typeof(string) });
FieldBuilder field = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
MethodAttributes GetSetAttributes = MethodAttributes.Public | MethodAttributes.HideBySig;
MethodBuilder getMethod =
typeBuilder.DefineMethod("get_value", GetSetAttributes, propertyType, Type.EmptyTypes);
ILGenerator getIL = getMethod.GetILGenerator();
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, field);
getIL.Emit(OpCodes.Ret);
MethodBuilder setMethod =
typeBuilder.DefineMethod("set_value", GetSetAttributes, null, new Type[] { typeof(string) });
ILGenerator setIL = setMethod.GetILGenerator();
setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, field);
setIL.Emit(OpCodes.Ret);
property.SetGetMethod(getMethod);
property.SetSetMethod(setMethod);
}
그것은 잘 작동하지만,이 일을 어떤 간단한 방법이 ? 모든 의견을 환영합니다. 감사합니다
, 일부 샘플 XM L,하지만 난 아직도 당신의 코드가 실제로 무엇을하는지 이해하는 데 어려움을 겪고있다. 현재 가지고있는 코드의 예를 게시 할 수 있습니까? – jrista
귀하의 의견을 보내 주셔서 감사합니다. 콘텐츠를 수정했습니다. 지저분한 코드에 대해 사과드립니다. – Gnavvy