| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent ab6d2c5 commit 80dc9f0
6 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -550,7 +550,7 @@ internal static int ToInt32(BorrowedReference value) | |||
| 550 | 550 | /// <summary> | |
| 551 | 551 | /// Convert a Python value to an instance of a primitive managed type. | |
| 552 | 552 | /// </summary> | |
| 553 | - private static bool ToPrimitive(BorrowedReference value, Type obType, out object? result, bool setError) | ||
| 553 | + internal static bool ToPrimitive(BorrowedReference value, Type obType, out object? result, bool setError) | ||
| 554 | 554 | { | |
| 555 | 555 | result = null; | |
| 556 | 556 | if (obType.IsEnum) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -101,5 +101,7 @@ public static PyFloat AsFloat(PyObject value) | |||
| 101 | 101 | PythonException.ThrowIfIsNull(op); | |
| 102 | 102 | return new PyFloat(op.Steal()); | |
| 103 | 103 | } | |
| 104 | + | ||
| 105 | + public override TypeCode GetTypeCode() => TypeCode.Double; | ||
| 104 | 106 | } | |
| 105 | 107 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -230,5 +230,7 @@ public string ToString(string format, IFormatProvider formatProvider) | |||
| 230 | 230 | using var _ = Py.GIL(); | |
| 231 | 231 | return ToBigInteger().ToString(format, formatProvider); | |
| 232 | 232 | } | |
| 233 | + | ||
| 234 | + public override TypeCode GetTypeCode() => TypeCode.Int64; | ||
| 233 | 235 | } | |
| 234 | 236 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,53 @@ | |||
| 1 | + using System; | ||
| 2 | + | ||
| 3 | + namespace Python.Runtime; | ||
| 4 | + | ||
| 5 | + public partial class PyObject : IConvertible | ||
| 6 | + { | ||
| 7 | + public virtual TypeCode GetTypeCode() => TypeCode.Object; | ||
| 8 | + | ||
| 9 | + private T DoConvert<T>() | ||
| 10 | + { | ||
| 11 | + using var _ = Py.GIL(); | ||
| 12 | + if (Converter.ToPrimitive(Reference, typeof(T), out object? result, setError: false)) | ||
| 13 | + { | ||
| 14 | + return (T)result!; | ||
| 15 | + } | ||
| 16 | + else | ||
| 17 | + { | ||
| 18 | + throw new InvalidCastException(); | ||
| 19 | + } | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public bool ToBoolean(IFormatProvider provider) => DoConvert<bool>(); | ||
| 23 | + public byte ToByte(IFormatProvider provider) => DoConvert<byte>(); | ||
| 24 | + public char ToChar(IFormatProvider provider) => DoConvert<char>(); | ||
| 25 | + public short ToInt16(IFormatProvider provider) => DoConvert<short>(); | ||
| 26 | + public int ToInt32(IFormatProvider provider) => DoConvert<int>(); | ||
| 27 | + public long ToInt64(IFormatProvider provider) => DoConvert<long>(); | ||
| 28 | + public sbyte ToSByte(IFormatProvider provider) => DoConvert<sbyte>(); | ||
| 29 | + public ushort ToUInt16(IFormatProvider provider) => DoConvert<ushort>(); | ||
| 30 | + public uint ToUInt32(IFormatProvider provider) => DoConvert<uint>(); | ||
| 31 | + public ulong ToUInt64(IFormatProvider provider) => DoConvert<ulong>(); | ||
| 32 | + | ||
| 33 | + public float ToSingle(IFormatProvider provider) => DoConvert<float>(); | ||
| 34 | + public double ToDouble(IFormatProvider provider) => DoConvert<double>(); | ||
| 35 | + | ||
| 36 | + public string ToString(IFormatProvider provider) => DoConvert<string>(); | ||
| 37 | + | ||
| 38 | + public DateTime ToDateTime(IFormatProvider provider) => throw new InvalidCastException(); | ||
| 39 | + public decimal ToDecimal(IFormatProvider provider) => throw new InvalidCastException(); | ||
| 40 | + | ||
| 41 | + public object ToType(Type conversionType, IFormatProvider provider) | ||
| 42 | + { | ||
| 43 | + if (Converter.ToManaged(Reference, conversionType, out object? result, setError: false)) | ||
| 44 | + { | ||
| 45 | + return result!; | ||
| 46 | + } | ||
| 47 | + else | ||
| 48 | + { | ||
| 49 | + throw new InvalidCastException(); | ||
| 50 | + } | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -59,5 +59,7 @@ public static bool IsStringType(PyObject value) | |||
| 59 | 59 | { | |
| 60 | 60 | return Runtime.PyString_Check(value.obj); | |
| 61 | 61 | } | |
| 62 | + | ||
| 63 | + public override TypeCode GetTypeCode() => TypeCode.String; | ||
| 62 | 64 | } | |
| 63 | 65 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -670,3 +670,10 @@ def test_int_param_resolution_required(): | |||
| 670 | 670 | data = list(mri.MethodA(0x100000000, 10)) | |
| 671 | 671 | assert len(data) == 10 | |
| 672 | 672 | assert data[0] == 0 | |
| 673 | + | ||
| 674 | + def test_iconvertible_conversion(): | ||
| 675 | + change_type = System.Convert.ChangeType | ||
| 676 | + | ||
| 677 | + assert 1024 == change_type(1024, System.Int32) | ||
| 678 | + assert 1024 == change_type(1024, System.Int64) | ||
| 679 | + assert 1024 == change_type(1024, System.Int16) | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments