ln.manage/ManagedObjectPropertyDescri...

130 lines
4.7 KiB
C#

// /**
// * File: ManagedObjectDescriptor.cs
// * Author: haraldwolff
// *
// * This file and it's content is copyrighted by the Author and / or copyright holder.
// * Any use wihtout proper permission is illegal and may lead to legal actions.
// *
// *
// **/
using System;
using System.Reflection;
using ln.json;
using ln.types.net;
namespace ln.manage
{
public class ManagedObjectPropertyDescriptor
{
public ManagedObjectProvider Provider { get; }
public Type ManagedType => Provider.ManagedType;
public string PropertyName { get; }
public Type PropertyType { get; }
public bool ReadOnly { get; }
public string LookupPath { get; }
Action<object, object> setter;
Func<object, object> getter;
public ManagedObjectPropertyDescriptor(ManagedObjectProvider objectProvider, string propertyName, Type propertyType, bool readOnly, string lookupPath, Func<object, object> getter, Action<object, object> setter)
{
Provider = objectProvider;
PropertyName = propertyName;
PropertyType = propertyType;
ReadOnly = readOnly;
LookupPath = lookupPath;
this.getter = getter;
this.setter = setter;
}
public ManagedObjectPropertyDescriptor(ManagedObjectProvider objectProvider,string propertyName,Type propertyType,bool readOnly,string lookupPath)
:this(objectProvider,propertyName,propertyType,readOnly,lookupPath,null,null)
{}
public ManagedObjectPropertyDescriptor(ManagedObjectProvider objectProvider, FieldInfo fieldInfo, string lookupPath)
: this(objectProvider, fieldInfo.Name, fieldInfo.FieldType, fieldInfo.IsInitOnly, lookupPath, fieldInfo.GetValue, fieldInfo.SetValue)
{}
public ManagedObjectPropertyDescriptor(ManagedObjectProvider objectProvider, FieldInfo fieldInfo)
: this(objectProvider, fieldInfo, null)
{}
public ManagedObjectPropertyDescriptor(ManagedObjectProvider objectProvider, PropertyInfo propertyInfo, string lookupPath)
: this(objectProvider, propertyInfo.Name, propertyInfo.PropertyType, !propertyInfo.CanWrite, lookupPath, propertyInfo.GetValue, propertyInfo.SetValue)
{}
public ManagedObjectPropertyDescriptor(ManagedObjectProvider objectProvider, PropertyInfo propertyInfo)
: this(objectProvider, propertyInfo, null)
{}
public void SetValue(object managedObject, object value) => setter(managedObject, value);
public object GetValue(object managedObject) => getter(managedObject);
public JSONObject CreateJsonDescriptor()
{
JSONObject descriptor = new JSONObject();
descriptor["name"] = PropertyName;
descriptor["readonly"] = ReadOnly;
if (typeof(string).Equals(PropertyType))
{
descriptor["type"] = "string";
}
else if (typeof(int).Equals(PropertyType))
{
descriptor["type"] = "int";
}
else if (typeof(double).Equals(PropertyType))
{
descriptor["type"] = "double";
}
else if (typeof(IPv4).Equals(PropertyType))
{
descriptor["type"] = "ip4";
}
else if (typeof(IPv6).Equals(PropertyType))
{
descriptor["type"] = "ip6";
}
else if (typeof(MAC).Equals(PropertyType))
{
descriptor["type"] = "mac";
}
else if (PropertyType.IsEnum)
{
if (PropertyType.GetCustomAttribute<FlagsAttribute>() != null)
{
JSONObject type = new JSONObject();
string[] names = Enum.GetNames(PropertyType);
int[] values = (int[])Enum.GetValues(PropertyType);
for (int n = 0; n < names.Length; n++)
type[names[n]] = values[n];
descriptor["type"] = type;
}
else
{
JSONArray type = new JSONArray();
string[] symbols = Enum.GetNames(PropertyType);
foreach (string symbol in symbols)
type.Add(symbol);
descriptor["type"] = type;
}
}
else if (LookupPath != null)
{
// ToDo: Implement Referenced Objects
throw new NotImplementedException();
}
else
{
throw new NotSupportedException();
}
return descriptor;
}
}
}