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);
}
}
}