diff --git a/Scripts/Node.cs b/Scripts/Node.cs
index 704e99d..b705627 100644
--- a/Scripts/Node.cs
+++ b/Scripts/Node.cs
@@ -52,7 +52,13 @@ namespace XNode {
/// Allow connections where output value type is assignable from input value type (eg. Object --> ScriptableObject)
InheritedInverse,
/// Allow connections where output value type is assignable from input value or input value type is assignable from output value type
- InheritedAny
+ InheritedAny,
+ /// Allow connections where input value type is castable from output value type.
+ Castable,
+ /// Allow connections where output value type is castable from input value type.
+ CastableInverse,
+ /// Allow connections where input value type is castable from output value type or output value type is castable from input value type.
+ CastableAny
}
#region Obsolete
diff --git a/Scripts/NodePort.cs b/Scripts/NodePort.cs
index 6bcc638..14c3b7d 100644
--- a/Scripts/NodePort.cs
+++ b/Scripts/NodePort.cs
@@ -279,6 +279,9 @@ namespace XNode {
if (output.typeConstraint == XNode.Node.TypeConstraint.Strict && input.ValueType != output.ValueType) return false;
if (output.typeConstraint == XNode.Node.TypeConstraint.InheritedInverse && !output.ValueType.IsAssignableFrom(input.ValueType)) return false;
if (output.typeConstraint == XNode.Node.TypeConstraint.InheritedAny && !input.ValueType.IsAssignableFrom(output.ValueType) && !output.ValueType.IsAssignableFrom(input.ValueType)) return false;
+ if (output.typeConstraint == XNode.Node.TypeConstraint.Castable && !input.ValueType.IsCastableFrom(output.ValueType)) return false;
+ if (output.typeConstraint == XNode.Node.TypeConstraint.CastableInverse && !output.ValueType.IsCastableFrom(input.ValueType)) return false;
+ if (output.typeConstraint == XNode.Node.TypeConstraint.CastableAny && !input.ValueType.IsCastableFrom(output.ValueType) && !output.ValueType.IsCastableFrom(input.ValueType)) return false;
// Success
return true;
}
diff --git a/Scripts/TypeExtensions.cs b/Scripts/TypeExtensions.cs
new file mode 100644
index 0000000..ae49c31
--- /dev/null
+++ b/Scripts/TypeExtensions.cs
@@ -0,0 +1,16 @@
+using System.Linq;
+using System.Reflection;
+
+public static class TypeExtensions
+{
+ /// Determines whether an instance of a specified type can be assigned to a variable of the current type.
+ public static bool IsCastableFrom(this Type to, Type from)
+ {
+ if ( to.IsAssignableFrom ( from ) )
+ return true;
+ return from.GetMethods ( BindingFlags.Public | BindingFlags.Static ).Any ( m =>
+ {
+ return m.ReturnType == to && ( m.Name == "op_Implicit" || m.Name == "op_Explicit" );
+ } );
+ }
+}