A NuGet package. It aim is to help you write extendable and command-based console programs in C# and .Net.
https://www.craigoates.net/Software/Project/7
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.8 KiB
174 lines
5.8 KiB
using System; |
|
|
|
namespace Console.Waterworks.Specialists |
|
{ |
|
internal static class CoercionSpecialist |
|
{ |
|
internal static object CoerceArgument(Type requiredType, string inputValue) |
|
{ |
|
var requiredTypeCode = Type.GetTypeCode(requiredType); |
|
string exceptionMessage = $"Cannnot coerce the input argument {inputValue} to required type {requiredType.Name}"; |
|
|
|
object result = null; |
|
switch (requiredTypeCode) |
|
{ |
|
case TypeCode.String: |
|
result = inputValue; |
|
break; |
|
|
|
case TypeCode.Int16: |
|
short number16; |
|
if (Int16.TryParse(inputValue, out number16)) |
|
{ |
|
result = number16; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
|
|
case TypeCode.Int32: |
|
int number32; |
|
if (Int32.TryParse(inputValue, out number32)) |
|
{ |
|
result = number32; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
|
|
case TypeCode.Int64: |
|
long number64; |
|
if (Int64.TryParse(inputValue, out number64)) |
|
{ |
|
result = number64; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
|
|
case TypeCode.Boolean: |
|
bool trueFalse; |
|
if (bool.TryParse(inputValue, out trueFalse)) |
|
{ |
|
result = trueFalse; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
|
|
case TypeCode.Byte: |
|
byte byteValue; |
|
if (byte.TryParse(inputValue, out byteValue)) |
|
{ |
|
result = byteValue; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
|
|
case TypeCode.Char: |
|
char charValue; |
|
if (char.TryParse(inputValue, out charValue)) |
|
{ |
|
result = charValue; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
|
|
case TypeCode.DateTime: |
|
DateTime dateValue; |
|
if (DateTime.TryParse(inputValue, out dateValue)) |
|
{ |
|
result = dateValue; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
case TypeCode.Decimal: |
|
Decimal decimalValue; |
|
if (Decimal.TryParse(inputValue, out decimalValue)) |
|
{ |
|
result = decimalValue; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
case TypeCode.Double: |
|
Double doubleValue; |
|
if (Double.TryParse(inputValue, out doubleValue)) |
|
{ |
|
result = doubleValue; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
case TypeCode.Single: |
|
Single singleValue; |
|
if (Single.TryParse(inputValue, out singleValue)) |
|
{ |
|
result = singleValue; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
case TypeCode.UInt16: |
|
UInt16 uInt16Value; |
|
if (UInt16.TryParse(inputValue, out uInt16Value)) |
|
{ |
|
result = uInt16Value; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
case TypeCode.UInt32: |
|
UInt32 uInt32Value; |
|
if (UInt32.TryParse(inputValue, out uInt32Value)) |
|
{ |
|
result = uInt32Value; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
case TypeCode.UInt64: |
|
UInt64 uInt64Value; |
|
if (UInt64.TryParse(inputValue, out uInt64Value)) |
|
{ |
|
result = uInt64Value; |
|
} |
|
else |
|
{ |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
break; |
|
default: |
|
throw new ArgumentException(exceptionMessage); |
|
} |
|
return result; |
|
} |
|
} |
|
}
|
|
|