解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ÀàÐÍת»» Utility
## ¸ÅÊö
`Utility` ÊÇ NewLife.Core ÖÐ×î»ù´¡µÄ¹¤¾ßÀ࣬Ìṩ¸ßЧ¡¢°²È«µÄÀàÐÍת»»À©Õ¹·½·¨¡£ËùÓÐת»»·½·¨¾ùÖ§³ÖĬÈÏÖµ£¬ÔÚת»»Ê§°Üʱ·µ»ØÄ¬ÈÏÖµ¶ø²»Å׳öÒì³££¬¼«´ó¼ò»¯ÁËÈÕ³£¿ª·¢ÖеÄÀàÐÍת»»²Ù×÷¡£
**ÃüÃû¿Õ¼ä**£º`NewLife`
**ÎĵµµØÖ·**£ºhttps://newlifex.com/core/utility
## ºËÐÄÌØÐÔ
- **°²È«×ª»»**£ºËùÓÐת»»Ê§°Üʱ·µ»ØÄ¬ÈÏÖµ£¬²»Å׳öÒì³£
- **À©Õ¹·½·¨**£ºÖ±½ÓÔÚ¶ÔÏóÉϵ÷Óà `.ToInt()`¡¢`.ToDateTime()` µÈ
- **¶àÀàÐÍÖ§³Ö**£ºÖ§³Ö×Ö·û´®¡¢È«½Ç×Ö·û¡¢×Ö½ÚÊý×顢ʱ¼ä´ÁµÈ¶àÖÖÊäÈë
- **¸ßÐÔÄÜ**£ºÕë¶Ô³£¼û³¡¾°Éî¶ÈÓÅ»¯£¬±ÜÃâ²»±ØÒªµÄÄÚ´æ·ÖÅä
- **¿ÉÀ©Õ¹**£ºÍ¨¹ý `DefaultConvert` ÀàÖ§³Ö×Ô¶¨Òåת»»Âß¼
## ¿ìËÙ¿ªÊ¼
```csharp
using NewLife;
// ×Ö·û´®×ªÕûÊý
var num = "123".ToInt(); // 123
var num2 = "abc".ToInt(-1); // -1£¨×ª»»Ê§°Ü·µ»ØÄ¬ÈÏÖµ£©
// ×Ö·û´®×ªÊ±¼ä
var dt = "2024-01-15".ToDateTime();
var dt2 = "invalid".ToDateTime(); // DateTime.MinValue
// ¶ÔÏóת²¼¶û
var flag = "true".ToBoolean(); // true
var flag2 = "1".ToBoolean(); // true
var flag3 = "yes".ToBoolean(); // true
```
## API ²Î¿¼
### ÕûÊýת»»
#### ToInt
```csharp
public static Int32 ToInt(this Object? value, Int32 defaultValue = 0)
```
½«¶ÔÏóת»»Îª32λÕûÊý¡£
**Ö§³ÖµÄÊäÈëÀàÐÍ**£º
- ×Ö·û´®£¨º¬È«½ÇÊý×Ö£©
- ×Ö½ÚÊý×飨С¶ËÐò£¬1-4×Ö½Ú£©
- DateTime£¨×ªÎªUnixÃ룬²»º¬Ê±Çø×ª»»£©
- DateTimeOffset£¨×ªÎªUnixÃ룩
- ʵÏÖ `IConvertible` µÄÀàÐÍ
**ʾÀý**£º
```csharp
// »ù±¾×ª»»
"123".ToInt() // 123
" 456 ".ToInt() // 456£¨×Ô¶¯È¥³ý¿Õ¸ñ£©
"£±£²£³".ToInt() // 123£¨Ö§³ÖÈ«½ÇÊý×Ö£©
"1,234,567".ToInt() // 1234567£¨Ö§³Öǧ·Ö룩
// ×Ö½ÚÊý×éת»»£¨Ð¡¶ËÐò£©
new Byte[] { 0x01 }.ToInt() // 1
new Byte[] { 0x01, 0x00 }.ToInt() // 1
new Byte[] { 0x01, 0x00, 0x00, 0x00 }.ToInt() // 1
// ʱ¼äתUnixÃë
DateTime.Now.ToInt() // µ±Ç°Unixʱ¼ä´Á£¨Ã룩
// ת»»Ê§°Ü·µ»ØÄ¬ÈÏÖµ
"abc".ToInt() // 0
"abc".ToInt(-1) // -1
((Object?)null).ToInt() // 0
```
#### ToLong
```csharp
public static Int64 ToLong(this Object? value, Int64 defaultValue = 0)
```
½«¶ÔÏóת»»Îª64볤ÕûÊý¡£
**ÌØÊâ´¦Àí**£º
- DateTime תΪ Unix ºÁÃ루²»º¬Ê±Çø×ª»»£©
- ×Ö½ÚÊý×éÖ§³Ö 1-8 ×Ö½Ú
**ʾÀý**£º
```csharp
"9223372036854775807".ToLong() // Int64.MaxValue
DateTime.Now.ToLong() // µ±Ç°Unixʱ¼ä´Á£¨ºÁÃ룩
```
### ¸¡µãÊýת»»
#### ToDouble
```csharp
public static Double ToDouble(this Object? value, Double defaultValue = 0)
```
½«¶ÔÏóת»»ÎªË«¾«¶È¸¡µãÊý¡£
**ʾÀý**£º
```csharp
"3.14".ToDouble() // 3.14
"3.14E+10".ToDouble() // 31400000000£¨Ö§³Ö¿ÆÑ§¼ÆÊý·¨£©
"1,234.56".ToDouble() // 1234.56£¨Ö§³Öǧ·Ö룩
```
#### ToDecimal
```csharp
public static Decimal ToDecimal(this Object? value, Decimal defaultValue = 0)
```
½«¶ÔÏóת»»Îª¸ß¾«¶È¸¡µãÊý£¬ÊÊÓÃÓÚ½ðÈÚ¼ÆËãµÈ¾«¶ÈÒªÇó¸ßµÄ³¡¾°¡£
**ʾÀý**£º
```csharp
"123456789.123456789".ToDecimal() // ¾«È·±£ÁôСÊý
```
### ²¼¶ûֵת»»
#### ToBoolean
```csharp
public static Boolean ToBoolean(this Object? value, Boolean defaultValue = false)
```
½«¶ÔÏóת»»Îª²¼¶ûÖµ¡£
**Ö§³ÖµÄÕæÖµ**£º`true`¡¢`True`¡¢`1`¡¢`y`¡¢`yes`¡¢`on`¡¢`enable`¡¢`enabled`
**Ö§³ÖµÄ¼ÙÖµ**£º`false`¡¢`False`¡¢`0`¡¢`n`¡¢`no`¡¢`off`¡¢`disable`¡¢`disabled`
**ʾÀý**£º
```csharp
"true".ToBoolean() // true
"True".ToBoolean() // true
"1".ToBoolean() // true
"yes".ToBoolean() // true
"on".ToBoolean() // true
"enable".ToBoolean() // true
"false".ToBoolean() // false
"0".ToBoolean() // false
"no".ToBoolean() // false
"off".ToBoolean() // false
"invalid".ToBoolean() // false£¨Ä¬ÈÏÖµ£©
"invalid".ToBoolean(true) // true£¨Ö¸¶¨Ä¬ÈÏÖµ£©
```
### ʱ¼äת»»
#### ToDateTime
```csharp
public static DateTime ToDateTime(this Object? value)
public static DateTime ToDateTime(this Object? value, DateTime defaultValue)
```
½«¶ÔÏóת»»ÎªÊ±¼äÈÕÆÚ¡£
**Ö§³ÖµÄ¸ñʽ**£º
- ±ê×¼ÈÕÆÚʱ¼ä×Ö·û´®
- `yyyy-M-d` ¸ñʽ
- `yyyy/M/d` ¸ñʽ
- `yyyyMMddHHmmss` ¸ñʽ
- `yyyyMMdd` ¸ñʽ
- Unix Ã루Int32£©
- Unix ºÁÃ루Int64£¬×Ô¶¯Åжϣ©
- UTC ±ê¼Ç£¨Ä©Î² `Z` »ò ` UTC`£©
**ʾÀý**£º
```csharp
// ×Ö·û´®×ª»»
"2024-01-15".ToDateTime()
"2024-1-5".ToDateTime() // Ö§³Öµ¥Î»ÊýÔÂÈÕ
"2024/01/15".ToDateTime()
"20240115".ToDateTime()
"20240115120000".ToDateTime()
"2024-01-15 12:30:45".ToDateTime()
"2024-01-15T12:30:45Z".ToDateTime() // UTC ʱ¼ä
// Unix ʱ¼ä´Áת»»
1705276800.ToDateTime() // Unix Ãë
1705276800000L.ToDateTime() // Unix ºÁÃ루×Ô¶¯Åжϣ©
```
> **×¢Òâ**£ºÕûÊýתʱ¼äʱ²»½øÐÐ UTC Óë±¾µØÊ±¼äת»»¡£ÔÚÎïÁªÍø³¡¾°ÖУ¬É豸¿ÉÄÜλÓÚ²»Í¬Ê±Çø£¬½¨ÒéͳһʹÓà UTC ʱ¼ä´«ÊäºóÔÙת»»¡£
#### ToDateTimeOffset
```csharp
public static DateTimeOffset ToDateTimeOffset(this Object? value)
public static DateTimeOffset ToDateTimeOffset(this Object? value, DateTimeOffset defaultValue)
```
½«¶ÔÏóת»»Îª´øÊ±ÇøµÄʱ¼äÈÕÆÚ¡£
### ʱ¼ä¸ñʽ»¯
#### ToFullString
```csharp
public static String ToFullString(this DateTime value, String? emptyValue = null)
public static String ToFullString(this DateTime value, Boolean useMillisecond, String? emptyValue = null)
```
½«Ê±¼ä¸ñʽ»¯Îª `yyyy-MM-dd HH:mm:ss` ±ê×¼¸ñʽ¡£
**²ÎÊý˵Ã÷**£º
- `useMillisecond`£ºÊÇ·ñ°üº¬ºÁÃ룬¸ñʽΪ `yyyy-MM-dd HH:mm:ss.fff`
- `emptyValue`£ºµ±Ê±¼äΪ `MinValue` ʱÏÔʾµÄÌæ´ú×Ö·û´®
**ʾÀý**£º
```csharp
DateTime.Now.ToFullString() // "2024-01-15 12:30:45"
DateTime.Now.ToFullString(true) // "2024-01-15 12:30:45.123"
DateTime.MinValue.ToFullString("") // ""
DateTime.MinValue.ToFullString("N/A") // "N/A"
```
#### Trim
```csharp
public static DateTime Trim(this DateTime value, String format = "s")
```
½Ø¶Ïʱ¼ä¾«¶È¡£
**¸ñʽ²ÎÊý**£º
- `ns`£ºÄÉÃ뾫¶È£¨Êµ¼ÊΪ 100ns£¬¼´ 1 tick£©
- `us`£ºÎ¢Ã뾫¶È
- `ms`£ººÁÃ뾫¶È
- `s`£ºÃ뾫¶È£¨Ä¬ÈÏ£©
- `m`£º·ÖÖÓ¾«¶È
- `h`£ºÐ¡Ê±¾«¶È
**ʾÀý**£º
```csharp
var dt = new DateTime(2024, 1, 15, 12, 30, 45, 123);
dt.Trim("s") // 2024-01-15 12:30:45.000
dt.Trim("m") // 2024-01-15 12:30:00.000
dt.Trim("h") // 2024-01-15 12:00:00.000
dt.Trim("ms") // ±£ÁôºÁÃë
```
### ×Ö½Úµ¥Î»¸ñʽ»¯
#### ToGMK
```csharp
public static String ToGMK(this Int64 value, String? format = null)
public static String ToGMK(this UInt64 value, String? format = null)
```
½«×Ö½ÚÊý¸ñʽ»¯Îª¿É¶ÁµÄµ¥Î»×Ö·û´®¡£
**ʾÀý**£º
```csharp
1024L.ToGMK() // "1.00K"
1048576L.ToGMK() // "1.00M"
1073741824L.ToGMK() // "1.00G"
1099511627776L.ToGMK() // "1.00T"
// ×Ô¶¨Òå¸ñʽ
1536L.ToGMK("n1") // "1.5K"
1536L.ToGMK("n0") // "2K"
```
### Òì³£´¦Àí
#### GetTrue
```csharp
public static Exception GetTrue(this Exception ex)
```
»ñÈ¡Òì³£µÄÕæÊµÄÚ²¿Òì³££¬×Ô¶¯½â°ü `AggregateException`¡¢`TargetInvocationException`¡¢`TypeInitializationException` µÈ°ü×°Òì³£¡£
**ʾÀý**£º
```csharp
try
{
// ¿ÉÄÜÅ׳ö°ü×°Òì³£µÄ´úÂë
}
catch (Exception ex)
{
var realEx = ex.GetTrue();
Console.WriteLine(realEx.Message);
}
```
#### GetMessage
```csharp
public static String GetMessage(this Exception ex)
```
»ñÈ¡¸ñʽ»¯µÄÒì³£ÏûÏ¢£¬¹ýÂ˵ô²»±ØÒªµÄ¶ÑÕ»ÐÅÏ¢£¨Èç `System.Runtime.ExceptionServices` µÈ£©¡£
## ×Ô¶¨Òåת»»
ͨ¹ýÌæ»» `Utility.Convert` ¿ÉÒÔ×Ô¶¨ÒåËùÓÐÀàÐÍת»»µÄÐÐΪ£º
```csharp
public class MyConvert : DefaultConvert
{
public override Int32 ToInt(Object? value, Int32 defaultValue)
{
// ×Ô¶¨Òåת»»Âß¼
if (value is MyCustomType mct)
return mct.Value;
return base.ToInt(value, defaultValue);
}
}
// È«¾ÖÌæ»»
Utility.Convert = new MyConvert();
```
## ×î¼Ñʵ¼ù
### 1. ʼÖÕÌṩÓÐÒâÒåµÄĬÈÏÖµ
```csharp
// ÍÆ¼ö£ºÃ÷È·Ö¸¶¨Ä¬ÈÏÖµ
var port = config["Port"].ToInt(8080);
var timeout = config["Timeout"].ToInt(30);
// ²»ÍƼö£ºÊ¹ÓÃÒþʽĬÈÏÖµ 0 ¿ÉÄܵ¼ÖÂÎÊÌâ
var port = config["Port"].ToInt(); // Èç¹ûÅäÖÃȱʧ£¬¶Ë¿ÚΪ 0
```
### 2. ʱ¼ä´Áת»»×¢ÒâÊ±Çø
```csharp
// ÎïÁªÍø³¡¾°£ºÉ豸Éϱ¨ UTC ʱ¼ä´Á
var deviceTime = timestamp.ToDateTime(); // ²»º¬Ê±Çø×ª»»
var localTime = deviceTime.ToLocalTime(); // תΪ±¾µØÊ±¼ä
// »òÕßʹÓà DateTimeOffset
var dto = timestamp.ToDateTimeOffset();
```
### 3. ÀûÓÃÁ´Ê½µ÷Óüò»¯´úÂë
```csharp
// ´«Í³Ð´·¨
Int32 value;
if (!Int32.TryParse(str, out value))
value = defaultValue;
// NewLife д·¨
var value = str.ToInt(defaultValue);
```
## ÐÔÄÜ˵Ã÷
- ËùÓÐת»»·½·¨Õë¶Ô³£¼ûÀàÐÍ£¨String¡¢Int32 µÈ£©½øÐÐÁË¿ìËÙ·¾¶ÓÅ»¯
- ×Ö·û´®×ª»»Ê¹Óà `Span<T>` ±ÜÃâ²»±ØÒªµÄÄÚ´æ·ÖÅä
- ʱ¼ä¸ñʽ»¯±ÜÃâʹÓà `ToString()` ¸ñʽ»¯£¬²ÉÓÃÊÖ¶¯Æ´½ÓÌáÉýÐÔÄÜ
- ×Ö½ÚÊý×éת»»Ö±½ÓʹÓà `BitConverter`£¬ÎÞ¶îÍ⿪Ïú
## Ïà¹ØÁ´½Ó
- [×Ö·û´®À©Õ¹ StringHelper](/NewLife/X/Blob/master/Doc/string_helper-×Ö·û´®À©Õ¹StringHelper.md)
- [Êý¾ÝÀ©Õ¹ IOHelper](/NewLife/X/Blob/master/Doc/io_helper-Êý¾ÝÀ©Õ¹IOHelper.md)
|