blob: 08277ea165eb9eefa184c811a9450c67662a01a6 [file] [log] [blame]
using BaSys40.Models.Core;
using BaSys40.Models.Core.AssetAdministrationShell.Generics;
using BaSys40.Models.Core.AssetAdministrationShell.Implementations;
using BaSys40.Models.Core.Identification;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
namespace BaSys40.RI.AAS.SmartControl
{
public static class SmartControlUtils
{
public static PropertyDescription GetPropertyDescription(PropertyInfo property)
{
PropertyDescription propertyDescription = new PropertyDescription();
propertyDescription.Identification = new Identifier(property.Name, Identificator.Internal);
propertyDescription.DisplayName = property.Name;
propertyDescription.Writable = property.CanWrite;
propertyDescription.Readable = property.CanRead;
propertyDescription.DataType = new DataType(GetDataObjectType(property.PropertyType), IsEnumerableType(property.PropertyType), IsCollectionType(property.PropertyType));
return propertyDescription;
}
public static OperationDescription GetOperationDescription(MethodInfo method)
{
OperationDescription operation = new OperationDescription();
operation.Identification = new Identifier(method.Name, Identificator.Internal);
operation.DisplayName = method.Name;
var parameters = method.GetParameters();
operation.InputParameters = new List<IParameter>(parameters.Length);
for (int i = 0; i < parameters.Length; i++)
{
operation.InputParameters.Add(
new Parameter()
{
DataType = new DataType(GetDataObjectType(parameters[i].ParameterType), IsEnumerableType(parameters[i].ParameterType), IsCollectionType(parameters[i].ParameterType)),
ParameterName = parameters[i].Name
}
);
}
operation.OutputParameters = new List<IParameter>()
{
new Parameter()
{
Index = 0,
DataType = new DataType(GetDataObjectType(method.ReturnType), IsEnumerableType(method.ReturnType), IsCollectionType(method.ReturnType))
}
};
return operation;
}
static bool IsEnumerableType(Type type)
{
return (type.GetInterface(nameof(IList)) != null);
}
static bool IsCollectionType(Type type)
{
return (type.GetInterface(nameof(IDictionary)) != null);
}
static bool IsSimple(Type type)
{
var typeInfo = type.GetTypeInfo();
if (typeInfo.IsGenericType && typeInfo.GetGenericTypeDefinition() == typeof(Nullable<>))
return IsSimple(typeInfo.GetGenericArguments()[0]);
return typeInfo.IsPrimitive
|| typeInfo.IsEnum
|| type.Equals(typeof(string))
|| type.Equals(typeof(decimal));
}
private static DataObjectType GetDataObjectType(Type type)
{
switch (type.FullName)
{
case "System.Void": return DataObjectType.Void;
case "System.String": return DataObjectType.String;
case "System.SByte": return DataObjectType.Int8;
case "System.Int16": return DataObjectType.Int16;
case "System.Int32": return DataObjectType.Int32;
case "System.Int64": return DataObjectType.Int64;
case "System.Byte": return DataObjectType.UInt8;
case "System.UInt16": return DataObjectType.UInt16;
case "System.UInt32": return DataObjectType.UInt32;
case "System.UInt64": return DataObjectType.UInt64;
case "System.Boolean": return DataObjectType.Bool;
case "System.Single": return DataObjectType.Float;
case "System.Double": return DataObjectType.Double;
default:
if (!IsSimple(type))
return DataObjectType.Object;
else
return DataObjectType.None;
}
}
public static List<IArgument> ConvertStringArguments(string[] args)
{
List<IArgument> inputArguments = new List<IArgument>(args.Length);
for (int i = 0; i < args.Length; i++)
{
inputArguments.Add(
new Argument()
{
Index = i,
DataType = new DataType(DataObjectType.String, false, false),
Value = new ElementValue<string>(args[i])
});
}
return inputArguments;
}
public static string[] ConvertStringArguments(List<IArgument> arguments)
{
string[] args = new string[arguments.Count];
for (int i = 0; i < args.Length; i++)
{
args[i] = arguments[i].Value.Value.ToString();
}
return args;
}
}
}