?? optionconverter.cs
字號(hào):
#region Copyright & License
//
// Copyright 2001-2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#endregion
using System;
using System.Collections;
using System.Globalization;
using System.Reflection;
using System.Text;
using log4net.Core;
using log4net.Util.TypeConverters;
namespace log4net.Util
{
/// <summary>
/// A convenience class to convert property values to specific types.
/// </summary>
/// <remarks>
/// <para>
/// Utility functions for converting types and parsing values.
/// </para>
/// </remarks>
/// <author>Nicko Cadell</author>
/// <author>Gert Driesen</author>
public sealed class OptionConverter
{
#region Private Instance Constructors
/// <summary>
/// Initializes a new instance of the <see cref="OptionConverter" /> class.
/// </summary>
/// <remarks>
/// <para>
/// Uses a private access modifier to prevent instantiation of this class.
/// </para>
/// </remarks>
private OptionConverter()
{
}
#endregion Private Instance Constructors
#region Public Static Methods
// /// <summary>
// /// Concatenates two string arrays.
// /// </summary>
// /// <param name="l">Left array.</param>
// /// <param name="r">Right array.</param>
// /// <returns>Array containing both left and right arrays.</returns>
// public static string[] ConcatenateArrays(string[] l, string[] r)
// {
// return (string[])ConcatenateArrays(l, r);
// }
// /// <summary>
// /// Concatenates two arrays.
// /// </summary>
// /// <param name="l">Left array</param>
// /// <param name="r">Right array</param>
// /// <returns>Array containing both left and right arrays.</returns>
// public static Array ConcatenateArrays(Array l, Array r)
// {
// if (l == null)
// {
// throw new ArgumentNullException("l");
// }
// if (r == null)
// {
// throw new ArgumentNullException("r");
// }
//
// int len = l.Length + r.Length;
// Array a = Array.CreateInstance(l.GetType(), len);
//
// Array.Copy(l, 0, a, 0, l.Length);
// Array.Copy(r, 0, a, l.Length, r.Length);
//
// return a;
// }
// /// <summary>
// /// Converts string escape characters back to their correct values.
// /// </summary>
// /// <param name="s">String to convert.</param>
// /// <returns>Converted result.</returns>
// public static string ConvertSpecialChars(string s)
// {
// if (s == null)
// {
// throw new ArgumentNullException("s");
// }
// char c;
// int len = s.Length;
// StringBuilder buf = new StringBuilder(len);
//
// int i = 0;
// while(i < len)
// {
// c = s[i++];
// if (c == '\\')
// {
// c = s[i++];
// if (c == 'n') c = '\n';
// else if (c == 'r') c = '\r';
// else if (c == 't') c = '\t';
// else if (c == 'f') c = '\f';
// else if (c == '\b') c = '\b';
// else if (c == '\"') c = '\"';
// else if (c == '\'') c = '\'';
// else if (c == '\\') c = '\\';
// }
// buf.Append(c);
// }
// return buf.ToString();
// }
/// <summary>
/// Converts a string to a <see cref="bool" /> value.
/// </summary>
/// <param name="argValue">String to convert.</param>
/// <param name="defaultValue">The default value.</param>
/// <returns>The <see cref="bool" /> value of <paramref name="argValue" />.</returns>
/// <remarks>
/// <para>
/// If <paramref name="argValue"/> is "true", then <c>true</c> is returned.
/// If <paramref name="argValue"/> is "false", then <c>false</c> is returned.
/// Otherwise, <paramref name="defaultValue"/> is returned.
/// </para>
/// </remarks>
public static bool ToBoolean(string argValue, bool defaultValue)
{
if (argValue != null && argValue.Length > 0)
{
try
{
return bool.Parse(argValue);
}
catch(Exception e)
{
LogLog.Error("OptionConverter: [" + argValue + "] is not in proper bool form.", e);
}
}
return defaultValue;
}
// /// <summary>
// /// Converts a string to an integer.
// /// </summary>
// /// <param name="argValue">String to convert.</param>
// /// <param name="defaultValue">The default value.</param>
// /// <returns>The <see cref="int" /> value of <paramref name="argValue" />.</returns>
// /// <remarks>
// /// <para>
// /// <paramref name="defaultValue"/> is returned when <paramref name="argValue"/>
// /// cannot be converted to a <see cref="int" /> value.
// /// </para>
// /// </remarks>
// public static int ToInt(string argValue, int defaultValue)
// {
// if (argValue != null)
// {
// string s = argValue.Trim();
// try
// {
// return int.Parse(s, NumberFormatInfo.InvariantInfo);
// }
// catch (Exception e)
// {
// LogLog.Error("OptionConverter: [" + s + "] is not in proper int form.", e);
// }
// }
// return defaultValue;
// }
/// <summary>
/// Parses a file size into a number.
/// </summary>
/// <param name="argValue">String to parse.</param>
/// <param name="defaultValue">The default value.</param>
/// <returns>The <see cref="long" /> value of <paramref name="argValue" />.</returns>
/// <remarks>
/// <para>
/// Parses a file size of the form: number[KB|MB|GB] into a
/// long value. It is scaled with the appropriate multiplier.
/// </para>
/// <para>
/// <paramref name="defaultValue"/> is returned when <paramref name="argValue"/>
/// cannot be converted to a <see cref="long" /> value.
/// </para>
/// </remarks>
public static long ToFileSize(string argValue, long defaultValue)
{
if (argValue == null)
{
return defaultValue;
}
string s = argValue.Trim().ToUpper(CultureInfo.InvariantCulture);
long multiplier = 1;
int index;
if ((index = s.IndexOf("KB")) != -1)
{
multiplier = 1024;
s = s.Substring(0, index);
}
else if ((index = s.IndexOf("MB")) != -1)
{
multiplier = 1024 * 1024;
s = s.Substring(0, index);
}
else if ((index = s.IndexOf("GB")) != -1)
{
multiplier = 1024 * 1024 * 1024;
s = s.Substring(0, index);
}
if (s != null)
{
// Try again to remove whitespace between the number and the size specifier
s = s.Trim();
long longVal;
if (SystemInfo.TryParse(s, out longVal))
{
return longVal * multiplier;
}
else
{
LogLog.Error("OptionConverter: ["+ s +"] is not in the correct file size syntax.");
}
}
return defaultValue;
}
/// <summary>
/// Converts a string to an object.
/// </summary>
/// <param name="target">The target type to convert to.</param>
/// <param name="txt">The string to convert to an object.</param>
/// <returns>
/// The object converted from a string or <c>null</c> when the
/// conversion failed.
/// </returns>
/// <remarks>
/// <para>
/// Converts a string to an object. Uses the converter registry to try
/// to convert the string value into the specified target type.
/// </para>
/// </remarks>
public static object ConvertStringTo(Type target, string txt)
{
if (target == null)
{
throw new ArgumentNullException("target");
}
// If we want a string we already have the correct type
if (typeof(string) == target || typeof(object) == target)
{
return txt;
}
// First lets try to find a type converter
IConvertFrom typeConverter = ConverterRegistry.GetConvertFrom(target);
if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
{
// Found appropriate converter
return typeConverter.ConvertFrom(txt);
}
else
{
if (target.IsEnum)
{
// Target type is an enum.
// Use the Enum.Parse(EnumType, string) method to get the enum value
return ParseEnum(target, txt, true);
}
else
{
// We essentially make a guess that to convert from a string
// to an arbitrary type T there will be a static method defined on type T called Parse
// that will take an argument of type string. i.e. T.Parse(string)->T we call this
// method to convert the string to the type required by the property.
System.Reflection.MethodInfo meth = target.GetMethod("Parse", new Type[] {typeof(string)});
if (meth != null)
{
// Call the Parse method
return meth.Invoke(null, BindingFlags.InvokeMethod, null, new object[] {txt}, CultureInfo.InvariantCulture);
}
else
{
// No Parse() method found.
}
}
}
return null;
}
// /// <summary>
// /// Looks up the <see cref="IConvertFrom"/> for the target type.
// /// </summary>
// /// <param name="target">The type to lookup the converter for.</param>
// /// <returns>The converter for the specified type.</returns>
// public static IConvertFrom GetTypeConverter(Type target)
// {
// IConvertFrom converter = ConverterRegistry.GetConverter(target);
// if (converter == null)
// {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -