/// <summary> /// 任意类型处理 /// </summary> /// <param name="type">类型</param> private void getFullName(Type type) { string value; if (!IsXml && TypeNames.TryGetValue(type, out value)) { NameStream.WriteNotNull(value); } else if (type.IsGenericParameter) { NameStream.SimpleWriteNotNull(type.Name); } else if (type.IsArray) { Array(type, true); } else if (type.IsGenericType) { GenericFullName(type); } else { Type reflectedType = type.ReflectedType; if (reflectedType == null) { NameStream.WriteNotNull(type.Namespace); NameStream.Write('.'); NameStream.SimpleWriteNotNull(type.Name); } else { this.ReflectedType(type, reflectedType); } } }
/// <summary> /// 根据类型获取代码名称 /// </summary> /// <param name="type">类型</param> /// <returns>代码名称</returns> public static string GetFullName(Type type) { string value; if (TypeNames.TryGetValue(type, out value)) { return(value); } if (type.IsGenericParameter) { return(type.Name); } return(new TypeNameBuilder().GetTypeFullName(type)); }
private void ExportStruct(StreamWriter writer, Type type) { writer.WriteLine("Public Type {0}", type.Name); BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo[] fields = type.GetFields(bindingFlags); foreach (FieldInfo field in fields) { StringBuilder declaration = new StringBuilder(); Type fieldType; string typeName; MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(field, typeof(MarshalAsAttribute), false); if (marshalAs != null) { fieldType = GetUnmanagedType(marshalAs.Value); } else { fieldType = field.FieldType; } if (!TypeNames.TryGetValue(fieldType, out typeName)) { typeName = fieldType.Name; } if (marshalAs != null && marshalAs.SizeConst > 0) { if (typeName == "String") { writer.WriteLine("\t{0} As {1} * {2}", field.Name, typeName, marshalAs.SizeConst); } else { writer.WriteLine("\t{0}({1}) As {2}", field.Name, marshalAs.SizeConst, typeName); } } else { writer.WriteLine("\t{0} As {1}", field.Name, typeName); } } writer.WriteLine("End Type"); }
private void ExportStruct(StreamWriter writer, Type type) { writer.WriteLine("typedef struct"); writer.WriteLine("{"); BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo[] fields = type.GetFields(bindingFlags); foreach (FieldInfo field in fields) { StringBuilder declaration = new StringBuilder(); Type fieldType; string typeName; string arrayDeclaration; MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(field, typeof(MarshalAsAttribute), false); if (marshalAs != null) { fieldType = GetUnmanagedType(marshalAs.Value); } else { fieldType = field.FieldType; } if (!TypeNames.TryGetValue(fieldType, out typeName)) { typeName = fieldType.Name; } if (marshalAs != null && marshalAs.SizeConst > 0) { arrayDeclaration = string.Format("[{0}]", marshalAs.SizeConst); } else { arrayDeclaration = null; } writer.WriteLine("\t{0} {1}{2};", typeName, field.Name, arrayDeclaration); } writer.WriteLine("}} {0};", type.Name); }
private string GetMethodParamDeclaration(ParameterInfo param) { Type type = param.ParameterType.IsArray ? param.ParameterType.GetElementType() : param.ParameterType; bool isByRef = type.IsByRef || param.IsRetval || param.IsOut; if (type.IsByRef) { type = type.GetElementType(); } if (type.IsSubclassOf(typeof(Enum))) { type = typeof(int); } StringBuilder declaration = new StringBuilder(); string typeName; if (!TypeNames.TryGetValue(type, out typeName)) { typeName = type.Name; } if (type == typeof(StringBuilder)) { declaration.Append(typeName); } else if (isByRef) { declaration.AppendFormat("{0}*", typeName); } else { declaration.AppendFormat("const {0}", typeName); } declaration.AppendFormat(" {0}", param.Name); if (param.ParameterType.IsArray) { declaration.Append("[]"); } return(declaration.ToString()); }
/// <summary> /// 任意类型处理 /// </summary> /// <param name="type">类型</param> private void getNameNoArray(Type type) { string value; if (!IsXml && TypeNames.TryGetValue(type, out value)) { NameStream.WriteNotNull(value); } else if (type.IsGenericParameter) { NameStream.SimpleWriteNotNull(type.Name); } else if (type.IsGenericType) { GenericName(type); } else { NameStream.SimpleWriteNotNull(type.Name); } }
private static string GetName <T>() { var type = typeof(T); var b = TypeNames.TryGetValue(type, out var name); if (b) { return(name.Ns()); } var value = type.Name; lock (TypeNames) { b = TypeNames.TryGetValue(type, out var _); if (!b) { TypeNames.Add(type, value); } } return(value.Ns()); }
public FormDefinition GetDefinition(string xml, bool freeze) { var document = XDocument.Parse(xml); if (document.Root == null) { throw new InvalidOperationException("Invalid XML document."); } void AddMetadata(IDictionary <string, string> dict, XElement xelement) { const int stroffset = 5; // "meta-".Length foreach (var attr in xelement.Attributes()) { if (attr.Name.LocalName.StartsWith("meta-", StringComparison.OrdinalIgnoreCase)) { dict[attr.Name.LocalName.Substring(stroffset)] = attr.Value; } } } FormElement WithMetadata(FormElement element, XElement xelement) { AddMetadata(element.Metadata, xelement); return(element); } ILayout Terminal(XElement element) { var elementName = element.Name.LocalName.ToLower(); FormElement formElement; switch (elementName) { case "layout": return(Layout(element)); case "input": case "textarea": case "toggle": case "password": { var typeName = element.TryGetAttribute("type") ?? "string"; var attributes = new List <Attribute>(); Type propertyType; if (elementName == "input" && TypeConstructors.TryGetValue(typeName, out var constructor)) { var data = constructor(new XmlConstructionContext(element)); propertyType = data.PropertyType; attributes.AddRange(data.CustomAttributes); } else if (!TypeNames.TryGetValue(typeName, out propertyType)) { throw new InvalidOperationException($"Type '{typeName}' not found."); } var fieldName = element.TryGetAttribute("name"); attributes.Add(Utilities.GetFieldAttributeFromElement(element)); attributes.Add(Utilities.GetBindingAttributeFromElement(element)); switch (elementName) { case "textarea": attributes.Add(new MultiLineAttribute()); propertyType = typeof(string); break; case "toggle": attributes.Add(new ToggleAttribute()); propertyType = typeof(bool); break; case "password": attributes.Add(new PasswordAttribute()); propertyType = typeof(string); break; } attributes.AddRange(Utilities.GetValidatorsFromElement(element)); var property = new DynamicProperty(fieldName, propertyType, attributes.ToArray()); var deserializer = TryGetDeserializer(propertyType); formElement = Build(property, deserializer); if (formElement != null) { foreach (var initializer in FieldInitializers) { initializer.Initialize(formElement, property, deserializer); } formElement.LinePosition = (Position)(-1); } return(new FormElementLayout(WithMetadata(formElement, element))); } case "select": { var from = element.TryGetAttribute("from"); object itemsSource; string typeName; string displayPath; string valuePath; Type propertyType = null; if (!string.IsNullOrEmpty(from)) { if (from.StartsWith("type:")) { var qualifiedType = from.Substring("type:".Length); var nullable = false; if (qualifiedType.EndsWith("?")) { qualifiedType = qualifiedType.Substring(0, qualifiedType.Length - 1); nullable = true; } propertyType = Utilities.FindTypes(t => t.FullName == qualifiedType).FirstOrDefault(); itemsSource = propertyType ?? throw new InvalidOperationException($"Could not find type '{qualifiedType}'."); if (propertyType.IsValueType && nullable) { propertyType = typeof(Nullable <>).MakeGenericType(propertyType); itemsSource = propertyType; } typeName = element.TryGetAttribute("type"); } else { itemsSource = from; typeName = element.TryGetAttribute("type") ?? "string"; } displayPath = element.TryGetAttribute("displayPath"); valuePath = element.TryGetAttribute("valuePath"); } else { typeName = "string"; displayPath = "Name"; valuePath = "Value"; itemsSource = Utilities.GetSelectOptionsFromElement(element); } if (typeName != null && !TypeNames.TryGetValue(typeName, out propertyType)) { throw new InvalidOperationException($"Type '{typeName}' not found."); } if (propertyType.IsValueType && element.TryGetAttribute("nullable") != null && (!propertyType.IsGenericType || propertyType.GetGenericTypeDefinition() != typeof(Nullable <>))) { propertyType = typeof(Nullable <>).MakeGenericType(propertyType); } var fieldName = element.TryGetAttribute("name"); var attributes = new List <Attribute> { new SelectFromAttribute(itemsSource) { SelectionType = Utilities.TryParse(element.TryGetAttribute("as"), SelectionType.ComboBox), DisplayPath = displayPath, ValuePath = valuePath, ItemStringFormat = element.TryGetAttribute("itemStringFormat") }, Utilities.GetFieldAttributeFromElement(element), Utilities.GetBindingAttributeFromElement(element) }; attributes.AddRange(Utilities.GetValidatorsFromElement(element)); var property = new DynamicProperty(fieldName, propertyType, attributes.ToArray()); var deserializer = TryGetDeserializer(propertyType); formElement = Build(property, deserializer); if (formElement != null) { foreach (var initializer in FieldInitializers) { initializer.Initialize(formElement, property, deserializer); } formElement.LinePosition = (Position)(-1); } return(new FormElementLayout(WithMetadata(formElement, element))); } case "title": formElement = new TitleAttribute(element.GetAttributeOrValue("content")) { Icon = element.TryGetAttribute("icon") } .WithBaseProperties(element) .WithTextProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "heading": formElement = new HeadingAttribute(element.GetAttributeOrValue("content")) { Icon = element.TryGetAttribute("icon") } .WithBaseProperties(element) .WithTextProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "text": formElement = new TextAttribute(element.GetAttributeOrValue("content")) .WithBaseProperties(element) .WithTextProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "error": formElement = new ErrorTextAttribute(element.GetAttributeOrValue("content")) .WithBaseProperties(element) .WithTextProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "img": formElement = new ImageAttribute(element.TryGetAttribute("src")) { Width = element.TryGetAttribute("width"), Height = element.TryGetAttribute("height"), HorizontalAlignment = element.TryGetAttribute("align"), VerticalAlignment = element.TryGetAttribute("valign"), Stretch = element.TryGetAttribute("stretch"), StretchDirection = element.TryGetAttribute("direction") } .WithBaseProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "br": formElement = new BreakAttribute { Height = element.TryGetAttribute("height") } .WithBaseProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "hr": var hasMargin = element.TryGetAttribute("hasMargin"); formElement = (hasMargin != null ? new DividerAttribute(bool.Parse(hasMargin)) : new DividerAttribute()) .WithBaseProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); case "action": formElement = Utilities.GetAction(element) .WithBaseProperties(element) .GetElement(); return(new FormElementLayout(WithMetadata(formElement, element))); default: throw new InvalidOperationException($"Unknown element '{element.Name.LocalName}'."); } } GridColumnLayout Column(XElement element) { var elements = element.Elements().ToList(); var child = elements.Count == 1 ? Row(elements[0]) : new Layout(elements.Select(Row)); return(new GridColumnLayout( child, Utilities.ParseDouble(element.TryGetAttribute("width"), 1d), Utilities.ParseDouble(element.TryGetAttribute("left"), 0d), Utilities.ParseDouble(element.TryGetAttribute("right"), 0d))); } GridLayout Grid(XElement element) { return(new GridLayout( element.Elements().Select(Column), Utilities.ParseDouble(element.TryGetAttribute("top"), 0d), Utilities.ParseDouble(element.TryGetAttribute("bottom"), 0d))); } InlineLayout Inline(XElement element) { return(new InlineLayout( element.Elements().Select(Terminal), Utilities.ParseDouble(element.TryGetAttribute("top"), 0d), Utilities.ParseDouble(element.TryGetAttribute("bottom"), 0d))); } ILayout Row(XElement element) { if (!string.Equals(element.Name.LocalName, "row", StringComparison.OrdinalIgnoreCase)) { return(Terminal(element)); } if (element .Elements() .All(e => string.Equals(e.Name.LocalName, "col", StringComparison.OrdinalIgnoreCase))) { return(Grid(element)); } return(Inline(element)); } Layout Layout(XElement element) { return(new Layout( element.Elements().Select(Row), Utilities.ParseThickness(element.TryGetAttribute("margin")), Utilities.TryParse(element.TryGetAttribute("valign"), VerticalAlignment.Stretch), Utilities.TryParse(element.TryGetAttribute("align"), HorizontalAlignment.Stretch), Utilities.ParseNullableDouble(element.TryGetAttribute("minHeight")), Utilities.ParseNullableDouble(element.TryGetAttribute("maxHeight")))); } var form = new FormDefinition(null); // null indicates dynamic type AddMetadata(form.Metadata, document.Root); form.FormRows.Add(new FormRow(true, 1) { Elements = { new FormElementContainer(0, 1, Layout(document.Root)) } }); if (freeze) { form.FreezeAll(); } return(form); }
public IFormDefinition GetDefinition(string xml) { var document = XDocument.Parse(xml); var root = document.Root; if (root == null) { throw new InvalidOperationException("Invalid XML document."); } var form = new FormDefinition(null) // null indicates dynamic type { Grid = Utilities.GetGridWidths(root.GetSingleOrDefaultAttribute("grid")?.Value) ?? new[] { 1d } }; var gridLength = form.Grid.Length; void AddRow(FormElement formElement) { form.FormRows.Add(new FormRow { Elements = { new FormElementContainer(0, gridLength, formElement) } }); } var actions = new List <FormElement>(); string elementName = null; foreach (var element in root.Elements()) { elementName = element.Name.LocalName.ToLower(); switch (elementName) { case "input": var typeName = element.GetSingleOrDefaultAttribute("type")?.Value ?? "string"; if (!TypeNames.TryGetValue(typeName, out var propertyType)) { throw new InvalidOperationException($"Type '{typeName}' not found."); } var fieldName = element.GetSingleOrDefaultAttribute("name")?.Value; var attributes = new List <Attribute> { Utilities.GetFieldAttributeFromElement(element), Utilities.GetBindingAttributeFromElement(element) }; attributes.AddRange(Utilities.GetValidatorsFromElement(element)); var property = new DynamicProperty(fieldName, propertyType, attributes.ToArray()); var deserializer = TryGetDeserializer(propertyType); var formElement = Build(property, deserializer); if (formElement != null) { AddRow(formElement); foreach (var initializer in FieldInitializers) { initializer.Initialize(formElement, property, deserializer); } } break; case "title": AddRow(new TitleAttribute(element.GetAttributeOrValue("content")) { Icon = element.TryGetAttribute("icon") }.GetElement()); break; case "heading": AddRow(new HeadingAttribute(element.GetAttributeOrValue("content")) { Icon = element.TryGetAttribute("icon") }.GetElement()); break; case "text": AddRow(new TextAttribute(element.GetAttributeOrValue("content")).GetElement()); break; case "br": AddRow(new BreakAttribute { Height = element.TryGetAttribute("height") }.GetElement()); break; case "hr": var hasMargin = element.TryGetAttribute("hasMargin"); AddRow((hasMargin != null ? new DividerAttribute(bool.Parse(hasMargin)) : new DividerAttribute()).GetElement()); break; case "action": actions.Add(Utilities.GetAction(element).GetElement()); break; } if (elementName != "action" && actions.Count != 0) { form.FormRows.Add(new FormRow { Elements = { new FormElementContainer(0, gridLength, actions.ToList()) } }); actions.Clear(); } } if (elementName == "action" && actions.Count != 0) { form.FormRows.Add(new FormRow { Elements = { new FormElementContainer(0, gridLength, actions.ToList()) } }); actions.Clear(); } form.Freeze(); foreach (var element in form.FormRows.SelectMany(r => r.Elements).SelectMany(c => c.Elements)) { element.Freeze(); } return(form); }
private void ExportDelegate(StreamWriter writer, Type type) { MethodInfo method = type.GetMethod("Invoke"); string returnValue; if (!TypeNames.TryGetValue(method.ReturnType, out returnValue)) { returnValue = method.ReturnType.Name; } string functionName = type.Name; writer.Write("typedef {0} (*{1}) (", returnValue, functionName); ParameterInfo[] parameters = method.GetParameters(); if (parameters.Length == 0) { writer.Write("void"); } else { for (int i = 0; i < parameters.Length; i++) { ParameterInfo param = parameters[i]; Type fieldType; string typeName; string arrayDeclaration; string pointer; MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(param, typeof(MarshalAsAttribute), false); if (marshalAs != null) { fieldType = GetUnmanagedType(marshalAs.Value); } else if (param.ParameterType.IsByRef) { fieldType = param.ParameterType.GetElementType(); } else { fieldType = param.ParameterType; } if (!TypeNames.TryGetValue(fieldType, out typeName)) { typeName = fieldType.Name; } if (marshalAs != null && marshalAs.SizeConst > 0) { arrayDeclaration = string.Format("[{0}]", marshalAs.SizeConst); } else { arrayDeclaration = null; } if (param.IsOut || param.IsRetval || param.ParameterType.IsByRef) { pointer = "*"; } else { pointer = null; } if (i > 0) { writer.Write(","); } writer.Write("{0} {1}{2}{3}", typeName, pointer, param.Name, arrayDeclaration); } } writer.WriteLine(");"); }
private void ExportDelegate(StreamWriter writer, Type type) { MethodInfo method = type.GetMethod("Invoke"); string returnValue; if (!TypeNames.TryGetValue(method.ReturnType, out returnValue)) { returnValue = method.ReturnType.Name; } string functionName = type.Name; writer.WriteLine("\tpublic interface {0} extends com.sun.jna.Callback {{", functionName); writer.Write("\t\t{0} invoke(", returnValue); ParameterInfo[] parameters = method.GetParameters(); if (parameters.Length > 0) { for (int i = 0; i < parameters.Length; i++) { ParameterInfo param = parameters[i]; Type fieldType; string typeName; string arrayDeclaration; MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(param, typeof(MarshalAsAttribute), false); if (marshalAs != null) { fieldType = GetUnmanagedType(marshalAs.Value); } else if (param.ParameterType.IsByRef) { fieldType = param.ParameterType.GetElementType(); } else { fieldType = param.ParameterType; } if (fieldType.IsSubclassOf(typeof(Enum))) { fieldType = typeof(int); } bool isByRef = param.IsOut || param.IsRetval || param.ParameterType.IsByRef; if (isByRef) { ByRefTypeNames.TryGetValue(fieldType, out typeName); } else { TypeNames.TryGetValue(fieldType, out typeName); } if (typeName == null) { typeName = string.Format("{0}.{1}", className, fieldType.Name); } if (marshalAs != null && marshalAs.SizeConst > 0) { arrayDeclaration = string.Format("[{0}]", marshalAs.SizeConst); } else { arrayDeclaration = null; } if (i > 0) { writer.Write(","); } writer.Write("{0} {1}{2}", typeName, param.Name, arrayDeclaration); } } writer.WriteLine(");"); writer.WriteLine("\t}"); }
private void ExportStruct(StreamWriter writer, Type type) { writer.WriteLine("\tpublic static class {0} extends Structure {{", type.Name); StringBuilder fieldNames = new StringBuilder(); BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; FieldInfo[] fields = type.GetFields(bindingFlags); foreach (FieldInfo field in fields) { StringBuilder declaration = new StringBuilder(); Type fieldType; string typeName; MarshalAsAttribute marshalAs = (MarshalAsAttribute)Attribute.GetCustomAttribute(field, typeof(MarshalAsAttribute), false); if (marshalAs != null) { fieldType = GetUnmanagedType(marshalAs.Value); } else { fieldType = field.FieldType; } if (!TypeNames.TryGetValue(fieldType, out typeName)) { typeName = fieldType.Name; } if (marshalAs != null && marshalAs.SizeConst > 0) { writer.WriteLine("\t\tpublic {0}[] {1} = new {0}[{2}];", (typeName.Equals("char") ? "byte" : typeName), field.Name, marshalAs.SizeConst); } else { writer.WriteLine("\t\tpublic {0} {1};", typeName, field.Name); } if (fieldNames.Length > 0) { fieldNames.Append(" , "); } fieldNames.AppendFormat("\"{0}\"", field.Name); } writer.WriteLine(); writer.WriteLine("\t\t@Override"); writer.WriteLine("\t\tprotected List<String> getFieldOrder() {"); writer.WriteLine("\t\t\treturn Arrays.asList({0});", fieldNames); writer.WriteLine("\t\t}"); writer.WriteLine(); writer.WriteLine("\t\tpublic static class ByReference extends {0} implements Structure.ByReference {{ }}", type.Name); writer.WriteLine("\t\tpublic static class ByValue extends {0} implements Structure.ByValue {{ }}", type.Name); writer.WriteLine("\t}"); writer.WriteLine(); }