Support for Enums
This commit is contained in:
parent
5b0ce2e52c
commit
8034a11fe3
|
@ -11,7 +11,16 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
{
|
{
|
||||||
var info = new UserDataType(t);
|
var info = new UserDataType(t);
|
||||||
_types.Add(t, info);
|
_types.Add(t, info);
|
||||||
BoundTypeHandler.LoadUserDataTypeDefinition(new UserDataBoundTypeDefinition(t));
|
UserDataBoundTypeDefinition boundType;
|
||||||
|
if (t.IsEnum)
|
||||||
|
{
|
||||||
|
boundType = new UserDataBoundEnumDefinition(t);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boundType = UserDataBoundTypeDefinition.Create(t);
|
||||||
|
}
|
||||||
|
BoundTypeHandler.LoadUserDataTypeDefinition(boundType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LoadType<T>()
|
public static void LoadType<T>()
|
||||||
|
|
|
@ -1,19 +1,28 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Upsilon.BaseTypes;
|
using Upsilon.BaseTypes;
|
||||||
|
using Type = Upsilon.BaseTypes.Type;
|
||||||
|
|
||||||
namespace Upsilon.BoundTypes
|
namespace Upsilon.BoundTypes
|
||||||
{
|
{
|
||||||
public class UserDataBoundTypeDefinition : BoundTypeDefinition
|
public class UserDataBoundTypeDefinition : BoundTypeDefinition
|
||||||
{
|
{
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
public Dictionary<string, UserDataBoundProperty> Properties { get; }
|
public Dictionary<string, UserDataBoundProperty> Properties { get; protected set; }
|
||||||
|
|
||||||
public UserDataBoundTypeDefinition(System.Type backingType)
|
internal UserDataBoundTypeDefinition(System.Type backingType)
|
||||||
: base(Type.UserData, backingType)
|
: base(Type.UserData, backingType)
|
||||||
{
|
{
|
||||||
Name = backingType.Name;
|
Name = backingType.Name;
|
||||||
Properties = new Dictionary<string, UserDataBoundProperty>();
|
}
|
||||||
|
|
||||||
|
public static UserDataBoundTypeDefinition Create(System.Type backingType)
|
||||||
|
{
|
||||||
|
var obj = new UserDataBoundTypeDefinition(backingType)
|
||||||
|
{
|
||||||
|
Properties = new Dictionary<string, UserDataBoundProperty>()
|
||||||
|
};
|
||||||
var fields = backingType.GetFields().Select(x => new UserDataBoundProperty()
|
var fields = backingType.GetFields().Select(x => new UserDataBoundProperty()
|
||||||
{
|
{
|
||||||
Name = x.Name,
|
Name = x.Name,
|
||||||
|
@ -22,7 +31,7 @@ namespace Upsilon.BoundTypes
|
||||||
});
|
});
|
||||||
foreach (var f in fields)
|
foreach (var f in fields)
|
||||||
{
|
{
|
||||||
Properties.Add(f.Name.ToLowerInvariant(), f);
|
obj.Properties.Add(f.Name.ToLowerInvariant(), f);
|
||||||
}
|
}
|
||||||
var properties = backingType.GetProperties().Select(x => new UserDataBoundProperty()
|
var properties = backingType.GetProperties().Select(x => new UserDataBoundProperty()
|
||||||
{
|
{
|
||||||
|
@ -32,7 +41,7 @@ namespace Upsilon.BoundTypes
|
||||||
});
|
});
|
||||||
foreach (var f in properties)
|
foreach (var f in properties)
|
||||||
{
|
{
|
||||||
Properties.Add(f.Name.ToLowerInvariant(), f);
|
obj.Properties.Add(f.Name.ToLowerInvariant(), f);
|
||||||
}
|
}
|
||||||
var methods = backingType.GetMethods().Select(x => new UserDataBoundMethod()
|
var methods = backingType.GetMethods().Select(x => new UserDataBoundMethod()
|
||||||
{
|
{
|
||||||
|
@ -42,16 +51,39 @@ namespace Upsilon.BoundTypes
|
||||||
});
|
});
|
||||||
foreach (var f in methods)
|
foreach (var f in methods)
|
||||||
{
|
{
|
||||||
Properties.Add(f.Name.ToLowerInvariant(), f);
|
obj.Properties.Add(f.Name.ToLowerInvariant(), f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserDataBoundTypeDefinition(string name, Dictionary<string, UserDataBoundProperty> properties)
|
public class UserDataBoundEnumDefinition : UserDataBoundTypeDefinition
|
||||||
: base(Type.UserData, new System.Type[0])
|
|
||||||
{
|
{
|
||||||
Name = name;
|
public UserDataBoundEnumDefinition(System.Type enumType) : base(enumType)
|
||||||
Properties = properties;
|
{
|
||||||
|
if (!enumType.IsEnum)
|
||||||
|
throw new Exception("Trying to bind an enum with a type that's not an enum");
|
||||||
|
|
||||||
|
Properties = new Dictionary<string, UserDataBoundProperty>();
|
||||||
|
var enumUnderlyingType = Enum.GetUnderlyingType(enumType);
|
||||||
|
var enumValues = Enum.GetValues(enumType);
|
||||||
|
|
||||||
|
for (var i=0; i < enumValues.Length; i++)
|
||||||
|
{
|
||||||
|
// Retrieve the value of the ith enum item.
|
||||||
|
var value = enumValues.GetValue(i);
|
||||||
|
|
||||||
|
// Convert the value to its underlying type (int, byte, long, ...)
|
||||||
|
var underlyingValue = Convert.ChangeType(value, enumUnderlyingType);
|
||||||
|
var name = value.ToString().ToLowerInvariant();
|
||||||
|
Properties.Add(name, new UserDataBoundProperty()
|
||||||
|
{
|
||||||
|
Name = name,
|
||||||
|
ActualType = enumUnderlyingType.ToString(),
|
||||||
|
Type = Type.Number
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,8 @@ namespace Upsilon.StandardLibraries
|
||||||
if (type == typeof(ScriptType))
|
if (type == typeof(ScriptType))
|
||||||
// allows every type
|
// allows every type
|
||||||
return (Type) 255;
|
return (Type) 255;
|
||||||
|
if (type.IsEnum)
|
||||||
|
return Type.Number;
|
||||||
return Type.UserData;
|
return Type.UserData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue