소프트웨어 개발(SW Dev)/C#
사용자 지정 서식 공급자 구현
flowhistory
2023. 3. 15. 17:24
string.Format()을 사용자 정의에 따라 추가 형식으로 확장할 수 있는 클래스 구현 예시
1. 사용자 지정서식 클래스 UriEncodeFormatter 구현
using System;
using System.Globalization;
namespace CustomFormat
{
/// 클래스 요약 정보
/// 문자열 서식 지정을 위한 추가 기능을 제공하는 사용자 지정 서식 공급자 구현
/// "{arg#:st}"를 사용하여 형식이 지정된 값의 URI 인코딩을 제공함
sealed class UriEncodeFormatter : IFormatProvider, ICustomFormatter
{
public static readonly UriEncodeFormatter Default = new UriEncodeFormatter();
public object GetFormat(Type formatType)
{
// if 상용구이면
if (typeof(ICustomFormatter) == formatType)
return this;
else
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
// if "st"가 지정되지 않은 경우
if ("st" != format)
return _FormatOther(format, arg);
// "st"가 지정되고 arg가 비어 있지 않은 문자열이면 url 인코딩
var s = Convert.ChangeType(arg ,typeof(string)) as string;
if (null == s)
s = "";
return Uri.EscapeDataString(s);
}
string _FormatOther(string format, object arg)
{
// 기본 formattable
var fmt = arg as IFormattable;
if (null != fmt)
return fmt.ToString(format, CultureInfo.CurrentCulture);
else if (null!=arg)
return arg.ToString();
else
return string.Empty;
}
}
}
2. 구현된 UriEncodeFormatter 사용 예시
// Program.cs
static void Main(string[] args)
{
// 사용자 정의 urlencodeformatter 예1
Console.WriteLine(string.Format(UriEncodeFormatter.Default, "{0:st}", "aaa dddd@"));
// 사용자 정의 urlencodeformatter 예2
Console.WriteLine(string.Format(UriEncodeFormatter.Default, "{0:st}", "string !!!"));
// 출력 결과를 보기 위한 대기
Console.Read();
}
728x90