成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何將字符串動態轉換為指定的值類型

開發 后端
我們經常會遇到將字符串轉換為值類型的問題,比如"123" 轉換為一個Int32類型,這個很簡單,我們只要調用int.Parse 函數就可以實現。筆者今天要說的是,一些應用中往往在編碼階段無法知道字符串需要轉換成的值類型的具體類型,而需要在運行時動態指定類型進行轉換,遇到這種問題,我們如何解決?

先看一個字符串動態轉換的典型例子

如下函數,我們只知道value 是一個基本值類型,比如(System.Int32, System.Int16, System.Double 等等) 或者是一個字符串類型。但我們無法在編碼時確定這個value 具體是什么類型,它可能是由一個外部組件從某個數據源中讀出來的基本類型中的一種類型的實例或者是字符串類型實例。

這個函數希望實現比較value 是否在minValue, maxValue這兩個字符串對應的數值區間類,其中minValue 和 maxValue 構成一個閉區間,即

value in [minValue, maxValue]

public static bool MyComparer(object value, string minValue, string maxValue)

要解決這個問題,我們需要解決兩個基本問題。

1. 如何比較value 和 minValue, maxValue

2. 如何將minValue 和 maxValue 轉換到value 對應的數據類型

首先我們來看如何進行比較

所有的基本值類型和string 類型都實現 IComparable這個接口。我們可以指定 value 為 IComparable,然后調用CompareTo來進行比較。不過這里有個問題,CompareTo 函數的參數obj 雖然是一個 object 類型,但這個 obj 的類型必須和 value 一致,否則將發生異常。也就是說我們不能把minValue 任意轉換成某個類型比如 long 帶進去,而需要將 minValue 和 maxValue 轉換成和 value 一樣的類型才行。

下面我們就來討論如何將字符串動態轉換為指定的值類型

我們需要實現下面的函數:

public static object ToType(Type type, string value)

 type 為指定的類型,value 為輸入的字符串。

首先我們知道所有的基本值類型都有一個叫 Parse 靜態函數,我們只要把這個靜態函數反射出來,就可以通過這個靜態函數將字符串動態轉換成對應的值類型。

下面代碼給出如何反射出這個靜態函數。通過向對象type(Type類型)的GetMethods 函數輸入 BindingFlags.Static
    | BindingFlags.Public 參數,我們可以枚舉出這個類型所有的靜態公共函數。

然后我們判斷這個函數的名稱是否為 "Parse" ,由于 Parse 函數有多個重載,但一個參數的重載只有 Parse (String)

所以我們需要判斷mi 只有一個參數,這時取到的 mi 就是 Parse (String) 函數。

MethodInfo parseMethod = null;

foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static
    | BindingFlags.Public))
{
    if (mi.Name == "Parse" && mi.GetParameters().Length == 1)
    {
  parseMethod = mi;
  break;
    }
}

接下來就是如何調用這個函數來動態轉換字符串了。

如下面代碼,我們調用MethodInfo 的 Invoke 方法來動態調用這個函數,由于是靜態函數,第一個參數 obj 傳入null. 并在第二個參數中帶入value 這個參數。

parseMethod.Invoke(null, new object[] { value });

下面給出字符串動態轉換為指定類型的完整代碼

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace Eagelt.Convert
{
    public class ConvertString
    {
  public static object ToType(Type type, string value)
  {
if (type == typeof(string))
{
    return value;
}

MethodInfo parseMethod = null;

foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static
    | BindingFlags.Public))
{
    if (mi.Name == "Parse" && mi.GetParameters().Length == 1)
    {
  parseMethod = mi;
  break;
    }
}

if (parseMethod == null)
{
    throw new ArgumentException(string.Format(
  "Type: {0} has not Parse static method!", type));
}

return parseMethod.Invoke(null, new object[] { value });
  }
    }
}

MyComparer 函數的完整代碼

public static bool MyComparer(object value, string minValue, string maxValue)
  {
IComparable comparableObj = value as IComparable;

object min;
object max;

if (comparableObj == null)
{
    throw new ArgumentException(string.Format(
  "Type: {0} does not inherit from IComparable", value.GetType()));
}

min = ConvertString.ToType(value.GetType(), minValue);
max = ConvertString.ToType(value.GetType(), maxValue);

return comparableObj.CompareTo(min) >= 0 && comparableObj.CompareTo(max) <= 0;

  }
 

 測試代碼

Console.WriteLine(MyComparer(2, "1", "3"));
Console.WriteLine(MyComparer(3, "1", "2"));
Console.WriteLine(MyComparer((byte)2, "1", "3"));
Console.WriteLine(MyComparer((double)3, "1", "2"));
Console.WriteLine(MyComparer("3", "1", "2"));
 

 測試結果

True
False
True
False
False

最后提一個簡單的問題,供大家思考,如果我們需要將字符串動態轉換成我們自己定義的復雜類型,如何實現呢?

比如我們有一個結構

struct UInt128

{

public ulong Low;

public ulong High;
}

我們將這個結構的實例對象傳入到函數

Console.WriteLine(MyComparer((UInt128)2, "1", "3"));

這樣可以嗎?怎樣做才能做到呢?

【編輯推薦】

  1. C# 2010命名和可選參數的新特性
  2. 詳解C# 4.0中必選參數與可選參數混合的問題
  3. 在.NET上如何根據字符串動態創建控件
  4. 檢測含有中文字符串的實際長度
  5. 深入理解C# 3.0的五項主要改進
責任編輯:彭凡 來源: cnblogs
相關推薦

2024-02-19 15:38:08

JsonPython字符串

2021-12-29 16:40:54

Python語言字符串

2009-11-25 16:55:45

PHP函數explod

2024-01-04 09:17:03

前端開發CSV 格式JSON 字符串

2009-07-15 16:56:59

Jython類型Java類型

2023-10-16 09:26:48

CSS類型轉換

2021-11-29 00:17:41

JS符串轉換

2017-05-25 15:14:36

2020-12-17 08:08:15

CentOS

2009-12-01 14:00:37

PHP字符串轉換為數值

2024-03-12 07:35:39

Python字符串列表

2009-07-31 14:09:41

c#時間格式轉換

2024-05-30 08:40:41

大型語言模型LLM人工智能

2021-08-26 09:46:22

JavaScript字符串URL

2010-03-31 19:15:25

Oracle函數

2016-12-30 13:16:51

字符串算法代碼

2010-11-26 14:09:32

MySQL內置函數

2010-09-09 11:48:00

SQL函數字符串

2011-04-08 10:16:13

文本文件ACCESS數據庫

2022-05-11 17:21:05

Btrfs文件系統Fedora
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草网站| 又爽又黄axxx片免费观看 | 99久久久国产精品 | 欧美一区视频在线 | 91久久久久久久久久久久久 | 精品在线观看一区二区 | 国产精品极品美女在线观看免费 | 亚洲精品中文字幕在线观看 | 色偷偷噜噜噜亚洲男人 | 日韩在线视频免费观看 | 欧美久久久久久久久 | 亚洲精品免费视频 | 亚洲精品日韩综合观看成人91 | 91精品91久久久 | 国产精品乱码一区二区三区 | 国产成人亚洲精品自产在线 | 日韩欧美中文在线 | 99精品久久99久久久久 | 中文字幕一区在线观看视频 | 成人在线观看亚洲 | 亚洲成人一级 | 国产福利在线小视频 | 日韩在线国产精品 | 精品伦精品一区二区三区视频 | 天天在线操 | 欧美淫| 欧美视频1区 | 国产精品一区二区久久久久 | 欧美一区二| 亚洲欧美日韩在线 | 欧美一区二区三区 | 男女污污网站 | 亚洲精品一区二区三区四区高清 | 久久免费视频2 | 欧美亚洲国产一区二区三区 | 日韩精品视频一区二区三区 | 黄网站免费在线看 | 国产精产国品一二三产区视频 | 国产亚洲精品综合一区 | 中文字幕一区二区三区四区五区 | 久久99精品久久久久久 |