C#中的Converter的具體應(yīng)用
Converter是C#中一個(gè)非常有用的概念,主要用于類(lèi)型轉(zhuǎn)換。它通常以委托或接口的形式出現(xiàn),允許開(kāi)發(fā)者定義如何將一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型。下面我將詳細(xì)介紹Converter的概念、使用場(chǎng)景,并以布爾型轉(zhuǎn)換為例展示具體應(yīng)用。
Converter的基本概念
1. Converter委托
在C#中,Converter<TInput, TOutput>是一個(gè)泛型委托,定義在System命名空間中。它的簽名如下:
public delegate TOutput Converter<in TInput, out TOutput>(TInput input);
這個(gè)委托表示一個(gè)方法,該方法將對(duì)象從TInput類(lèi)型轉(zhuǎn)換為TOutput類(lèi)型。
2. 使用場(chǎng)景
Converter常用于:
- 集合類(lèi)型轉(zhuǎn)換
- 數(shù)據(jù)格式化
- 類(lèi)型適配
- 值轉(zhuǎn)換(如字符串到布爾值)
布爾型轉(zhuǎn)換示例
示例1:簡(jiǎn)單的字符串到布爾值轉(zhuǎn)換
// 定義轉(zhuǎn)換器
Converter<string, bool> stringToBoolConverter = s =>
s.Equals("true", StringComparison.OrdinalIgnoreCase) ||
s.Equals("1", StringComparison.OrdinalIgnoreCase) ||
s.Equals("yes", StringComparison.OrdinalIgnoreCase);
// 使用轉(zhuǎn)換器
string input = "Yes";
bool result = stringToBoolConverter(input);
Console.WriteLine(result); // 輸出: True示例2:使用Array.ConvertAll方法轉(zhuǎn)換數(shù)組
string[] stringBools = { "true", "False", "1", "0", "yes", "no" };
// 使用Array.ConvertAll和自定義轉(zhuǎn)換器
bool[] boolArray = Array.ConvertAll(stringBools, stringToBoolConverter);
foreach (bool b in boolArray)
{
Console.Write(b + " "); // 輸出: True False True False True False
}示例3:自定義轉(zhuǎn)換器類(lèi)
public class BoolConverter : IConverter<string, bool>
{
public bool Convert(string input)
{
return input switch
{
"true" or "1" or "yes" => true,
"false" or "0" or "no" => false,
_ => throw new ArgumentException("Invalid boolean string")
};
}
}
// 使用
var converter = new BoolConverter();
bool value = converter.Convert("yes"); // 返回true其他常見(jiàn)轉(zhuǎn)換場(chǎng)景
示例4:數(shù)字到布爾值轉(zhuǎn)換
Converter<int, bool> intToBoolConverter = i => i != 0; Console.WriteLine(intToBoolConverter(0)); // False Console.WriteLine(intToBoolConverter(1)); // True Console.WriteLine(intToBoolConverter(-5)); // True
示例5:對(duì)象到布爾值轉(zhuǎn)換(處理可能為null的情況)
Converter<object, bool> objectToBoolConverter = o =>
o != null && (o.ToString().Equals("true", StringComparison.OrdinalIgnoreCase) ||
o.ToString() == "1");
Console.WriteLine(objectToBoolConverter(null)); // False
Console.WriteLine(objectToBoolConverter("TRUE")); // True
Console.WriteLine(objectToBoolConverter(1)); // True示例6:使用內(nèi)置的Boolean.Parse和Boolean.TryParse
// 直接使用內(nèi)置方法
Converter<string, bool> builtInConverter = bool.Parse;
try
{
Console.WriteLine(builtInConverter("True")); // True
Console.WriteLine(builtInConverter("abc")); // 拋出FormatException
}
catch (FormatException)
{
Console.WriteLine("Invalid boolean format");
}
// 更安全的TryParse版本
string input = "abc";
if (bool.TryParse(input, out bool result))
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("Conversion failed");
}高級(jí)應(yīng)用場(chǎng)景
示例7:在LINQ中使用轉(zhuǎn)換器
List<string> stringList = new List<string> { "true", "false", "1", "0" };
// 使用ConvertAll方法
List<bool> boolList = stringList.ConvertAll(stringToBoolConverter);
// 或者使用LINQ Select
List<bool> boolList2 = stringList.Select(s => stringToBoolConverter(s)).ToList();示例8:可配置的轉(zhuǎn)換器
public class ConfigurableBoolConverter
{
private readonly string[] _trueValues;
private readonly string[] _falseValues;
public ConfigurableBoolConverter(string[] trueValues, string[] falseValues)
{
_trueValues = trueValues;
_falseValues = falseValues;
}
public bool Convert(string input)
{
if (_trueValues.Contains(input, StringComparer.OrdinalIgnoreCase))
return true;
if (_falseValues.Contains(input, StringComparer.OrdinalIgnoreCase))
return false;
throw new ArgumentException($"Cannot convert '{input}' to boolean");
}
}
// 使用
var converter = new ConfigurableBoolConverter(
trueValues: new[] { "on", "yes", "1" },
falseValues: new[] { "off", "no", "0" });
Console.WriteLine(converter.Convert("on")); // True
Console.WriteLine(converter.Convert("off")); // False總結(jié)
C#中的Converter模式提供了靈活的類(lèi)型轉(zhuǎn)換機(jī)制,特別適用于:
- 需要將一種類(lèi)型集合轉(zhuǎn)換為另一種類(lèi)型集合時(shí)
- 處理用戶(hù)輸入或外部數(shù)據(jù)源的不一致格式時(shí)
- 需要在不同系統(tǒng)或組件間轉(zhuǎn)換數(shù)據(jù)格式時(shí)
- 需要可配置或可擴(kuò)展的轉(zhuǎn)換邏輯時(shí)
對(duì)于布爾型轉(zhuǎn)換,Converter特別有用,因?yàn)椴紶栔翟诓煌舷挛闹锌赡苡卸喾N表示形式(如"true"/"false"、"yes"/"no"、1/0等)。通過(guò)使用Converter,可以集中管理這些轉(zhuǎn)換邏輯,提高代碼的可維護(hù)性和一致性。
到此這篇關(guān)于C#中的Converter的具體應(yīng)用的文章就介紹到這了,更多相關(guān)C# Converter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#連接Oracle數(shù)據(jù)庫(kù)的多種方法總結(jié)
最近小項(xiàng)目當(dāng)中要使用C#來(lái)連接Oracle數(shù)據(jù)庫(kù)來(lái)完成系統(tǒng)的操作,這篇文章主要給大家介紹了關(guān)于C#連接Oracle數(shù)據(jù)庫(kù)的多種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法
這篇文章主要介紹了C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法,需要的朋友可以參考下2014-08-08
WinForm中變Enter鍵為T(mén)ab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法
這篇文章主要介紹了WinForm中變Enter鍵為T(mén)ab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法,主要通過(guò)一個(gè)ControlTools類(lèi)來(lái)實(shí)現(xiàn)該功能,需要的朋友可以參考下2014-08-08
C#中DataSet,DataTable,DataView的區(qū)別與用法
這篇文章介紹了C#中DataSet,DataTable,DataView的區(qū)別與用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C#中一個(gè)方法返回多個(gè)值的實(shí)現(xiàn)方法小結(jié)
通常一個(gè)方法只能返回一個(gè)值,但是如果在某些時(shí)候,我們想要返回多個(gè)值,例如某個(gè)方法將一個(gè)浮點(diǎn)數(shù)分割成一個(gè)整數(shù)和一個(gè)小數(shù)返回,因此本文給大家介紹了C#中一個(gè)方法返回多個(gè)值的實(shí)現(xiàn)方法及示例代碼,需要的朋友可以參考下2024-05-05

