public void Non_Required_Value_Types_Are_Created_As_Nullable_Properties() { var attr = new XomNodeAttribute { Name = "attr1", Type = typeof(int), IsRequired = false}; var type = XomAttributeTypeGenerator.GenerateType(new[] {attr}, "Test"); var properties = type.GetProperties(); Assert.IsTrue(properties[0].PropertyType == typeof(int?)); }
public void Can_Specify_Name_For_Generated_Type() { var name = "TestName"; var attr1 = new XomNodeAttribute { Name = "attr1", Type = typeof(string) }; Type type = XomAttributeTypeGenerator.GenerateType(new[] {attr1}, name); Assert.AreEqual(name, type.Name, "Type's name was incorrect"); }
public void Can_Generate_Class_Based_On_Xom_Attributes() { var attr1 = new XomNodeAttribute {Name = "attr1", Type = typeof (string)}; var attr2 = new XomNodeAttribute {Name = "attr2", Type = typeof (int), IsRequired = true}; Type type = XomAttributeTypeGenerator.GenerateType(new[] {attr1, attr2}, "TestName"); Assert.IsNotNull(type, "Returned type was null"); var properties = type.GetProperties(); Assert.AreEqual(2, properties.Length, "Incorrect number of properties returned"); Assert.IsTrue(properties.Any(x => x.PropertyType == typeof(string) && x.Name == attr1.Name), "No string property exists with the name attr1"); Assert.IsTrue(properties.Any(x => x.PropertyType == typeof(int) && x.Name == attr2.Name), "No int property exists with the name attr2"); }
private static void CreateProperty(TypeBuilder typeBuilder, XomNodeAttribute attribute) { var attributeType = attribute.Type; if (attributeType.IsValueType && !attribute.IsRequired) attributeType = typeof (Nullable<>).MakeGenericType(attributeType); var fieldBuilder = typeBuilder.DefineField("_" + attribute.Name, attributeType, FieldAttributes.Private); var propertyBuilder = typeBuilder.DefineProperty(attribute.Name, PropertyAttributes.HasDefault, attributeType, null); var getPropMthdBldr = typeBuilder.DefineMethod("get_" + attribute.Name, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, attributeType, Type.EmptyTypes); var getIl = getPropMthdBldr.GetILGenerator(); getIl.Emit(OpCodes.Ldarg_0); getIl.Emit(OpCodes.Ldfld, fieldBuilder); getIl.Emit(OpCodes.Ret); MethodBuilder setPropMthdBldr = typeBuilder.DefineMethod("set_" + attribute.Name, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { attributeType }); ILGenerator setIl = setPropMthdBldr.GetILGenerator(); Label modifyProperty = setIl.DefineLabel(); Label exitSet = setIl.DefineLabel(); setIl.MarkLabel(modifyProperty); setIl.Emit(OpCodes.Ldarg_0); setIl.Emit(OpCodes.Ldarg_1); setIl.Emit(OpCodes.Stfld, fieldBuilder); setIl.Emit(OpCodes.Nop); setIl.MarkLabel(exitSet); setIl.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(getPropMthdBldr); propertyBuilder.SetSetMethod(setPropMthdBldr); }
public void Null_Name_Creates_Guid_Type_Name() { var attr1 = new XomNodeAttribute { Name = "attr1", Type = typeof(string) }; var type = XomAttributeTypeGenerator.GenerateType(new[] { attr1 }, null); Guid.Parse(type.Name); }