mirror of
https://github.com/Siccity/xNode.git
synced 2025-12-20 09:16:01 +08:00
Merge pull request #353 from LupusInferni315/master
Castable Type Constraints
This commit is contained in:
commit
1b64a96d40
@ -52,7 +52,13 @@ namespace XNode {
|
|||||||
/// <summary> Allow connections where output value type is assignable from input value type (eg. Object --> ScriptableObject)</summary>
|
/// <summary> Allow connections where output value type is assignable from input value type (eg. Object --> ScriptableObject)</summary>
|
||||||
InheritedInverse,
|
InheritedInverse,
|
||||||
/// <summary> Allow connections where output value type is assignable from input value or input value type is assignable from output value type</summary>
|
/// <summary> Allow connections where output value type is assignable from input value or input value type is assignable from output value type</summary>
|
||||||
InheritedAny
|
InheritedAny,
|
||||||
|
/// <summary> Allow connections where input value type is castable from output value type. </summary>
|
||||||
|
Castable,
|
||||||
|
/// <summary> Allow connections where output value type is castable from input value type. </summary>
|
||||||
|
CastableInverse,
|
||||||
|
/// <summary> Allow connections where input value type is castable from output value type or output value type is castable from input value type. </summary>
|
||||||
|
CastableAny
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Obsolete
|
#region Obsolete
|
||||||
|
|||||||
@ -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.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.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.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
|
// Success
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
16
Scripts/TypeExtensions.cs
Normal file
16
Scripts/TypeExtensions.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
public static class TypeExtensions
|
||||||
|
{
|
||||||
|
/// <summary> Determines whether an instance of a specified type can be assigned to a variable of the current type. </summary>
|
||||||
|
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" );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user