| using BaSys40.Models.Core.AssetAdministrationShell.Enums; |
| using BaSys40.Models.Core.AssetAdministrationShell.Implementations.DataElementSubtypes; |
| using BaSys40.Models.Core.Extensions.References; |
| using BaSys40.Models.Semantics; |
| using Newtonsoft.Json; |
| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.Reflection; |
| using System.Runtime.Serialization; |
| |
| namespace BaSys40.Models.Core |
| { |
| |
| [DataContract] |
| public class DataType : IHasSemantics, IEquatable<DataType> |
| { |
| [IgnoreDataMember] |
| public bool? IsCollection { get; internal set; } |
| |
| [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "dataObjectType")] |
| public DataObjectType DataObjectType { get; internal set; } |
| |
| [IgnoreDataMember] |
| public Type SystemType { get; internal set; } |
| |
| public IReference SemanticId { get; internal set; } |
| |
| [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "schemaType")] |
| public SchemaType? SchemaType { get; internal set; } |
| |
| [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "schema")] |
| public string Schema { get; internal set; } |
| |
| |
| //[DataMember(EmitDefaultValue = false, IsRequired = false, Name = "valueRank")] |
| //public ValueRank? ValueRank { get; } |
| |
| internal DataType() { } |
| |
| public DataType(DataObjectType dataObjectType) : this(dataObjectType, false, null) |
| { } |
| |
| [JsonConstructor] |
| public DataType(DataObjectType dataObjectType, bool? isCollection, IReference semanticId = null) |
| { |
| DataObjectType = dataObjectType; |
| SemanticId = semanticId; |
| |
| SystemType = GetSystemTypeFromDataType(dataObjectType); |
| |
| |
| if (isCollection.HasValue) |
| IsCollection = isCollection; |
| else |
| IsCollection = false; |
| |
| } |
| public DataType(IReference semanticId, SchemaType schemaType, string schema) |
| :this(DataObjectType.AnyType, false, semanticId) |
| { |
| SchemaType = schemaType; |
| Schema = schema; |
| } |
| |
| |
| /* |
| public enum ValueRank : int |
| { |
| Scalar = -1, |
| OneDimensional = 1, |
| TwoDimensional = 2, |
| ScalarOrOneDimensional = 3 |
| } |
| */ |
| public static DataType GetDataTypeFromSystemTypes(Type type) |
| { |
| DataType dataType = new DataType(); |
| Type innerType = null; |
| |
| if (IsGenericList(type)) |
| { |
| dataType.IsCollection = true; |
| innerType = type.GetGenericArguments()[0]; |
| } |
| else if (IsArray(type)) |
| { |
| dataType.IsCollection = true; |
| innerType = type.GetElementType(); |
| } |
| else |
| { |
| dataType.IsCollection = false; |
| innerType = type; |
| } |
| dataType.SystemType = innerType; |
| |
| switch (innerType.FullName) |
| { |
| case "System.Decimal": dataType.DataObjectType = DataObjectType.Decimal; break; |
| case "System.String": dataType.DataObjectType = DataObjectType.String; break; |
| case "System.SByte": dataType.DataObjectType = DataObjectType.Int8; break; |
| case "System.Int16": dataType.DataObjectType = DataObjectType.Int16; break; |
| case "System.Int32": dataType.DataObjectType = DataObjectType.Int32; break; |
| case "System.Int64": dataType.DataObjectType = DataObjectType.Int64; break; |
| case "System.Byte": dataType.DataObjectType = DataObjectType.UInt8; break; |
| case "System.UInt16": dataType.DataObjectType = DataObjectType.UInt16; break; |
| case "System.UInt32": dataType.DataObjectType = DataObjectType.UInt32; break; |
| case "System.UInt64": dataType.DataObjectType = DataObjectType.UInt64; break; |
| case "System.Boolean": dataType.DataObjectType = DataObjectType.Bool; break; |
| case "System.Single": dataType.DataObjectType = DataObjectType.Float; break; |
| case "System.Double": dataType.DataObjectType = DataObjectType.Double; break; |
| case "System.DateTime": dataType.DataObjectType = DataObjectType.DateTime; break; |
| case "System.Uri": dataType.DataObjectType = DataObjectType.AnyURI; break; |
| default: |
| if (!IsSimpleType(innerType)) |
| { |
| dataType.DataObjectType = DataObjectType.AnyType; |
| return dataType; |
| } |
| else |
| return null; |
| } |
| return dataType; |
| } |
| |
| public static bool IsGenericList(Type type) |
| { |
| return (type.IsGenericType && ( |
| type.GetGenericTypeDefinition() == typeof(List<>) || |
| type.GetGenericTypeDefinition() == typeof(IEnumerable<>))); |
| } |
| |
| public static bool IsArray(Type type) |
| { |
| return type.IsArray; |
| } |
| |
| public static Type GetSystemTypeFromDataType(DataObjectType dataObjectType) |
| { |
| if (dataObjectType == DataObjectType.String) |
| return typeof(string); |
| if (dataObjectType == DataObjectType.LangString) |
| return typeof(string); |
| else if (dataObjectType == DataObjectType.Bool) |
| return typeof(bool); |
| else if (dataObjectType == DataObjectType.Float) |
| return typeof(float); |
| else if (dataObjectType == DataObjectType.Double) |
| return typeof(double); |
| else if (dataObjectType == DataObjectType.UInt8) |
| return typeof(byte); |
| else if (dataObjectType == DataObjectType.UInt16) |
| return typeof(UInt16); |
| else if (dataObjectType == DataObjectType.UInt32) |
| return typeof(UInt32); |
| else if (dataObjectType == DataObjectType.UInt64) |
| return typeof(UInt64); |
| else if (dataObjectType == DataObjectType.Int8) |
| return typeof(sbyte); |
| else if (dataObjectType == DataObjectType.Int16) |
| return typeof(Int16); |
| else if (dataObjectType == DataObjectType.Int32) |
| return typeof(Int32); |
| else if (dataObjectType == DataObjectType.Int64) |
| return typeof(Int64); |
| else if (dataObjectType == DataObjectType.Integer) |
| return typeof(decimal); |
| else if (dataObjectType == DataObjectType.NegativeInteger) |
| return typeof(decimal); |
| else if (dataObjectType == DataObjectType.PositiveInteger) |
| return typeof(decimal); |
| else if (dataObjectType == DataObjectType.NonNegativeInteger) |
| return typeof(decimal); |
| else if (dataObjectType == DataObjectType.NonPositiveInteger) |
| return typeof(decimal); |
| else if (dataObjectType == DataObjectType.AnyType) |
| return typeof(object); |
| else if (dataObjectType == DataObjectType.AnySimpleType) |
| return typeof(string); |
| else if (dataObjectType == DataObjectType.DateTime) |
| return typeof(DateTime); |
| else if (dataObjectType == DataObjectType.DateTimeStamp) |
| return typeof(DateTime); |
| else if (dataObjectType == DataObjectType.AnyURI) |
| return typeof(Uri); |
| else if (dataObjectType == DataObjectType.Base64Binary) |
| return typeof(byte[]); |
| else if (dataObjectType == DataObjectType.HexBinary) |
| return typeof(byte[]); |
| else if (dataObjectType == DataObjectType.Duration) |
| return typeof(TimeSpan); |
| else if (dataObjectType == DataObjectType.DayTimeDuration) |
| return typeof(TimeSpan); |
| else if (dataObjectType == DataObjectType.YearMonthDuration) |
| return typeof(TimeSpan); |
| else if (dataObjectType == ModelType.Property) |
| return typeof(Property); |
| else if (dataObjectType == ModelType.Blob) |
| return typeof(Blob); |
| else if (dataObjectType == ModelType.File) |
| return typeof(File); |
| else if (dataObjectType == ModelType.ReferenceElement) |
| return typeof(ReferenceElement); |
| else if (dataObjectType == ModelType.DataElementCollection) |
| return typeof(DataElementCollection); |
| else |
| return null; |
| } |
| |
| public static Type GetSystemTypeFromDataType(DataType dataType) |
| { |
| return GetSystemTypeFromDataType(dataType.DataObjectType); |
| } |
| |
| public static bool IsSimpleType(Type type) |
| { |
| TypeInfo typeInfo = type.GetTypeInfo(); |
| if (typeInfo.IsGenericType && typeInfo.GetGenericTypeDefinition() == typeof(Nullable<>)) |
| return IsSimpleType(typeInfo.GetGenericArguments()[0]); |
| |
| return typeInfo.IsEnum || typeInfo.IsPrimitive || type.Equals(typeof(string)) || type.Equals(typeof(decimal)); |
| } |
| #region IEquatable Interface Implementation |
| public bool Equals(DataType other) |
| { |
| if (ReferenceEquals(null, other)) |
| { |
| return false; |
| } |
| if (ReferenceEquals(this, other)) |
| { |
| return true; |
| } |
| |
| return this.DataObjectType.Equals(other.DataObjectType) |
| && this.IsCollection.Equals(other.IsCollection); |
| } |
| public override bool Equals(object obj) |
| { |
| if (ReferenceEquals(null, obj)) |
| { |
| return false; |
| } |
| if (ReferenceEquals(this, obj)) |
| { |
| return true; |
| } |
| |
| return obj.GetType() == GetType() && Equals((DataType)obj); |
| } |
| |
| |
| public override int GetHashCode() |
| { |
| unchecked |
| { |
| var result = 0; |
| result = (result * 397) ^ DataObjectType.GetHashCode(); |
| result = (result * 397) ^ (IsCollection.Value ? 1 : 0); |
| return result; |
| } |
| } |
| |
| public static bool operator ==(DataType x, DataType y) |
| { |
| |
| if (ReferenceEquals(x, y)) |
| { |
| return true; |
| } |
| |
| if (ReferenceEquals(x, null)) |
| { |
| return false; |
| } |
| if (ReferenceEquals(y, null)) |
| { |
| return false; |
| } |
| |
| return x.DataObjectType == y.DataObjectType && x.IsCollection == y.IsCollection; |
| } |
| public static bool operator !=(DataType x, DataType y) |
| { |
| return !(x == y); |
| } |
| #endregion |
| |
| } |
| |
| |
| } |