diff --git a/Interop/VariadicArguments/CharArgument.cs b/Interop/VariadicArguments/CharArgument.cs deleted file mode 100644 index ee9a3b4..0000000 --- a/Interop/VariadicArguments/CharArgument.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 Ruben Buniatyan -// Licensed under the MIT License. For full terms, see LICENSE in the project root. - -#pragma warning disable 1591 - -using System; -using System.Runtime.InteropServices; - -namespace MissinKit.Interop.VariadicArguments -{ - public sealed class CharArgument : VariadicArgument - { - private readonly char _value; - - public CharArgument(char value) => _value = value; - - protected internal override void CopyTo(IntPtr ptr) => Marshal.Copy(new[] { _value }, 0, ptr, 1); - - public override int Size { get; } = sizeof(char); - - public override object Value => _value; - } -} diff --git a/Interop/VariadicArguments/DecimalArgument.cs b/Interop/VariadicArguments/DecimalArgument.cs deleted file mode 100644 index 90886f9..0000000 --- a/Interop/VariadicArguments/DecimalArgument.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 Ruben Buniatyan -// Licensed under the MIT License. For full terms, see LICENSE in the project root. - -#pragma warning disable 1591 - -using System; -using System.Runtime.InteropServices; - -namespace MissinKit.Interop.VariadicArguments -{ - public sealed class DecimalArgument : VariadicArgument - { - private readonly decimal _value; - - public DecimalArgument(decimal value) => _value = value; - - protected internal override void CopyTo(IntPtr ptr) => Marshal.Copy(new[] { (double) _value }, 0, ptr, 1); - - public override int Size { get; } = sizeof(double); - - public override object Value => _value; - } -} diff --git a/Interop/VariadicArguments/DoubleArgument.cs b/Interop/VariadicArguments/DoubleArgument.cs index b76f5b5..1bd07f9 100644 --- a/Interop/VariadicArguments/DoubleArgument.cs +++ b/Interop/VariadicArguments/DoubleArgument.cs @@ -17,7 +17,5 @@ public sealed class DoubleArgument : VariadicArgument protected internal override void CopyTo(IntPtr ptr) => Marshal.Copy(new[] { _value }, 0, ptr, 1); public override int Size { get; } = sizeof(double); - - public override object Value => _value; } } diff --git a/Interop/VariadicArguments/Int32Argument.cs b/Interop/VariadicArguments/Int32Argument.cs index 257fd75..8ea7cad 100644 --- a/Interop/VariadicArguments/Int32Argument.cs +++ b/Interop/VariadicArguments/Int32Argument.cs @@ -17,7 +17,5 @@ public sealed class Int32Argument : VariadicArgument protected internal override void CopyTo(IntPtr ptr) => Marshal.Copy(new[] { _value }, 0, ptr, 1); public override int Size { get; } = sizeof(int); - - public override object Value => _value; } } diff --git a/Interop/VariadicArguments/Int64Argument.cs b/Interop/VariadicArguments/Int64Argument.cs index c1a817e..8275300 100644 --- a/Interop/VariadicArguments/Int64Argument.cs +++ b/Interop/VariadicArguments/Int64Argument.cs @@ -17,7 +17,5 @@ public sealed class Int64Argument : VariadicArgument protected internal override void CopyTo(IntPtr ptr) => Marshal.Copy(new[] { _value }, 0, ptr, 1); public override int Size { get; } = sizeof(long); - - public override object Value => _value; } } diff --git a/Interop/VariadicArguments/SingleArgument.cs b/Interop/VariadicArguments/SingleArgument.cs deleted file mode 100644 index cc98c96..0000000 --- a/Interop/VariadicArguments/SingleArgument.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2016 Ruben Buniatyan -// Licensed under the MIT License. For full terms, see LICENSE in the project root. - -#pragma warning disable 1591 - -using System; -using System.Runtime.InteropServices; - -namespace MissinKit.Interop.VariadicArguments -{ - public sealed class SingleArgument : VariadicArgument - { - private readonly float _value; - - public SingleArgument(float value) => _value = value; - - protected internal override void CopyTo(IntPtr ptr) => Marshal.Copy(new[] { (double) _value }, 0, ptr, 1); - - public override int Size { get; } = sizeof(double); - - public override object Value => _value; - } -} diff --git a/Interop/VariadicArguments/StringArgument.cs b/Interop/VariadicArguments/StringArgument.cs index 0ee8204..4a2455e 100644 --- a/Interop/VariadicArguments/StringArgument.cs +++ b/Interop/VariadicArguments/StringArgument.cs @@ -44,7 +44,5 @@ protected internal override void CopyTo(IntPtr ptr) Marshal.Copy(new [] { _handle }, 0, ptr, 1); } - - public override object Value => _value; } } diff --git a/Interop/VariadicArguments/VariadicArgument.cs b/Interop/VariadicArguments/VariadicArgument.cs index f711cd4..24ec709 100644 --- a/Interop/VariadicArguments/VariadicArgument.cs +++ b/Interop/VariadicArguments/VariadicArgument.cs @@ -24,24 +24,20 @@ protected virtual void Dispose(bool disposing) public virtual int Size { get; } = IntPtr.Size; - public abstract object Value { get; } - protected internal abstract void CopyTo(IntPtr ptr); #region Operators - public static implicit operator VariadicArgument(char arg) => new CharArgument(arg); + public static implicit operator VariadicArgument(char arg) => new StringArgument(arg.ToString()); - public static implicit operator VariadicArgument(decimal arg) => new DecimalArgument(arg); + public static implicit operator VariadicArgument(decimal arg) => new DoubleArgument((double) arg); public static implicit operator VariadicArgument(double arg) => new DoubleArgument(arg); - public static implicit operator VariadicArgument(float arg) => new SingleArgument(arg); - public static implicit operator VariadicArgument(int arg) => new Int32Argument(arg); public static implicit operator VariadicArgument(long arg) => new Int64Argument(arg); - public static implicit operator VariadicArgument(nfloat arg) => nfloat.Size == sizeof(double) ? new DoubleArgument(arg) : (VariadicArgument) new SingleArgument((float) arg); + public static implicit operator VariadicArgument(nfloat arg) => new DoubleArgument(arg); public static implicit operator VariadicArgument(nint arg) => nint.Size == sizeof(long) ? new Int64Argument(arg) : (VariadicArgument) new Int32Argument((int) arg); diff --git a/MissinKit.csproj b/MissinKit.csproj index 7ceee13..7ecce8d 100644 --- a/MissinKit.csproj +++ b/MissinKit.csproj @@ -43,9 +43,6 @@ - - - diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index b5a0236..298e50b 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyInformationalVersion("1.4.1")] -[assembly: AssemblyVersion("1.4.1.*")] +[assembly: AssemblyInformationalVersion("1.4.2")] +[assembly: AssemblyVersion("1.4.2.*")] diff --git a/Utilities/StringExtensions.cs b/Utilities/StringExtensions.cs index 1ce9c8b..fa3691b 100644 --- a/Utilities/StringExtensions.cs +++ b/Utilities/StringExtensions.cs @@ -23,7 +23,7 @@ public static class StringExtensions /// A localized string for the current key in the default table of the main bundle /// into which the remaining argument values in args are substituted. /// - public static string Localize(this string key, params VariadicArgument[] args) => Localize(key, null, NSBundle.MainBundle, null, args); + public static string Localize(this string key, params object[] args) => Localize(key, null, NSBundle.MainBundle, null, args); /// /// Returns a localized string for the current key into which the remaining argument values are substituted. @@ -37,19 +37,70 @@ public static class StringExtensions /// A localized string for the current key in table of bundle /// into which the remaining argument values in args are substituted. /// - public static string Localize(this string key, string table, NSBundle bundle, string value, params VariadicArgument[] args) + public static string Localize(this string key, string table, NSBundle bundle, string value, params object[] args) { if (bundle == null) throw new ArgumentNullException(nameof(bundle)); - if (args.Length == 0) + var argCount = args?.Length ?? 0; + + if (argCount == 0) return bundle.LocalizedString(key, table, value); var str = bundle.LocalizedNSString(key, table, value); - - return string.CompareOrdinal(str.Class.Name, NSLocalizedString) == 0 - ? NSStringUtility.LocalizedFormat(str, args) - : string.Format(str, args.Select(a => a.Value).ToArray()); + + if (string.CompareOrdinal(str.Class.Name, NSLocalizedString) != 0) + return string.Format(str, args); + + var varargs = new VariadicArgument[argCount]; + + for (var i = 0; i < argCount; i++) + { + var arg = args[i]; + var type = arg?.GetType() ?? typeof(string); + + switch (Type.GetTypeCode(type)) + { + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.SByte: + case TypeCode.UInt16: + case TypeCode.UInt32: + varargs[i] = (int) arg; + break; + + case TypeCode.Decimal: + case TypeCode.Double: + case TypeCode.Single: + varargs[i] = (double) arg; + break; + + case TypeCode.Int64: + case TypeCode.UInt64: + varargs[i] = (long) arg; + break; + + case TypeCode.String: + varargs[i] = (string) arg; + break; + + case TypeCode.Object: + if (type == typeof(nfloat)) + varargs[i] = (nfloat) arg; + else if (type == typeof(nint)) + varargs[i] = (nint) arg; + else + varargs[i] = arg.ToString(); + break; + + default: + varargs[i] = arg.ToString(); + break; + } + } + + return NSStringUtility.LocalizedFormat(str, varargs); } } }