public override bool CastTo <Q>(ref Q target) { if (typeof(Q).IsSubclassOf(ScriptVariableType)) { target = (Q)(object)Value; return(true); } if (typeof(Q).IsAssignableFrom(ScriptVariableType)) { target = (Q)(object)Value; return(true); } switch (Value.StorageType) { case StorageType.Integer: if (typeof(Q).IsAssignableFrom(typeof(GH_Boolean))) { target = Value.Element is null ? (Q)(object)null : (Q)(object)new GH_Boolean(Value.AsInteger() != 0); return(true); } else if (typeof(Q).IsAssignableFrom(typeof(GH_Integer))) { target = Value.Element is null ? (Q)(object)null : (Q)(object)new GH_Integer(Value.AsInteger()); return(true); } else if (typeof(Q).IsAssignableFrom(typeof(GH_Number))) { target = Value.Element is null ? (Q)(object)null : (Q)(object)new GH_Number((double)Value.AsInteger()); return(true); } else if (typeof(Q).IsAssignableFrom(typeof(GH_Colour))) { if (Value.Element is object) { int value = Value.AsInteger(); int r = value % 256; value /= 256; int g = value % 256; value /= 256; int b = value % 256; target = (Q)(object)new GH_Colour(System.Drawing.Color.FromArgb(r, g, b)); } else { target = (Q)(object)null; } return(true); } break; case StorageType.Double: if (typeof(Q).IsAssignableFrom(typeof(GH_Number))) { target = Value.Element is null ? (Q)(object)null : (Q)(object)new GH_Number(ToRhino(Value.AsDouble(), Value.Definition.ParameterType)); return(true); } else if (typeof(Q).IsAssignableFrom(typeof(GH_Integer))) { if (Value.Element is object) { var value = Math.Round(ToRhino(Value.AsDouble(), Value.Definition.ParameterType)); if (int.MinValue <= value && value <= int.MaxValue) { target = (Q)(object)new GH_Integer((int)value); return(true); } } else { target = (Q)(object)null; return(true); } } break; case StorageType.String: if (typeof(Q).IsAssignableFrom(typeof(GH_String))) { target = Value.Element is null ? (Q)(object)null : (Q)(object)new GH_String(Value.AsString()); return(true); } break; case StorageType.ElementId: if (typeof(Q).IsSubclassOf(typeof(ID))) { target = Value.Element is null ? (Q)(object)null : (Q)(object)ID.Make(Value.AsElementId()); return(true); } break; } return(base.CastTo <Q>(ref target)); }