?? optionconverter.cs
字號:
// throw new InvalidOperationException("No type converter defined for [" + target + "]");
// }
// return converter;
// }
/// <summary>
/// Checks if there is an appropriate type conversion from the source type to the target type.
/// </summary>
/// <param name="sourceType">The type to convert from.</param>
/// <param name="targetType">The type to convert to.</param>
/// <returns><c>true</c> if there is a conversion from the source type to the target type.</returns>
/// <remarks>
/// Checks if there is an appropriate type conversion from the source type to the target type.
/// <para>
/// </para>
/// </remarks>
public static bool CanConvertTypeTo(Type sourceType, Type targetType)
{
if (sourceType == null || targetType == null)
{
return false;
}
// Check if we can assign directly from the source type to the target type
if (targetType.IsAssignableFrom(sourceType))
{
return true;
}
// Look for a To converter
IConvertTo tcSource = ConverterRegistry.GetConvertTo(sourceType, targetType);
if (tcSource != null)
{
if (tcSource.CanConvertTo(targetType))
{
return true;
}
}
// Look for a From converter
IConvertFrom tcTarget = ConverterRegistry.GetConvertFrom(targetType);
if (tcTarget != null)
{
if (tcTarget.CanConvertFrom(sourceType))
{
return true;
}
}
return false;
}
/// <summary>
/// Converts an object to the target type.
/// </summary>
/// <param name="sourceInstance">The object to convert to the target type.</param>
/// <param name="targetType">The type to convert to.</param>
/// <returns>The converted object.</returns>
/// <remarks>
/// <para>
/// Converts an object to the target type.
/// </para>
/// </remarks>
public static object ConvertTypeTo(object sourceInstance, Type targetType)
{
Type sourceType = sourceInstance.GetType();
// Check if we can assign directly from the source type to the target type
if (targetType.IsAssignableFrom(sourceType))
{
return sourceInstance;
}
// Look for a TO converter
IConvertTo tcSource = ConverterRegistry.GetConvertTo(sourceType, targetType);
if (tcSource != null)
{
if (tcSource.CanConvertTo(targetType))
{
return tcSource.ConvertTo(sourceInstance, targetType);
}
}
// Look for a FROM converter
IConvertFrom tcTarget = ConverterRegistry.GetConvertFrom(targetType);
if (tcTarget != null)
{
if (tcTarget.CanConvertFrom(sourceType))
{
return tcTarget.ConvertFrom(sourceInstance);
}
}
throw new ArgumentException("Cannot convert source object [" + sourceInstance.ToString() + "] to target type [" + targetType.Name + "]", "sourceInstance");
}
// /// <summary>
// /// Finds the value corresponding to <paramref name="key"/> in
// /// <paramref name="props"/> and then perform variable substitution
// /// on the found value.
// /// </summary>
// /// <param name="key">The key to lookup.</param>
// /// <param name="props">The association to use for lookups.</param>
// /// <returns>The substituted result.</returns>
// public static string FindAndSubst(string key, System.Collections.IDictionary props)
// {
// if (props == null)
// {
// throw new ArgumentNullException("props");
// }
//
// string v = props[key] as string;
// if (v == null)
// {
// return null;
// }
//
// try
// {
// return SubstituteVariables(v, props);
// }
// catch(Exception e)
// {
// LogLog.Error("OptionConverter: Bad option value [" + v + "].", e);
// return v;
// }
// }
/// <summary>
/// Instantiates an object given a class name.
/// </summary>
/// <param name="className">The fully qualified class name of the object to instantiate.</param>
/// <param name="superClass">The class to which the new object should belong.</param>
/// <param name="defaultValue">The object to return in case of non-fulfillment.</param>
/// <returns>
/// An instance of the <paramref name="className"/> or <paramref name="defaultValue"/>
/// if the object could not be instantiated.
/// </returns>
/// <remarks>
/// <para>
/// Checks that the <paramref name="className"/> is a subclass of
/// <paramref name="superClass"/>. If that test fails or the object could
/// not be instantiated, then <paramref name="defaultValue"/> is returned.
/// </para>
/// </remarks>
public static object InstantiateByClassName(string className, Type superClass, object defaultValue)
{
if (className != null)
{
try
{
Type classObj = SystemInfo.GetTypeFromString(className, true, true);
if (!superClass.IsAssignableFrom(classObj))
{
LogLog.Error("OptionConverter: A [" + className + "] object is not assignable to a [" + superClass.FullName + "] variable.");
return defaultValue;
}
return Activator.CreateInstance(classObj);
}
catch (Exception e)
{
LogLog.Error("OptionConverter: Could not instantiate class [" + className + "].", e);
}
}
return defaultValue;
}
/// <summary>
/// Performs variable substitution in string <paramref name="val"/> from the
/// values of keys found in <paramref name="props"/>.
/// </summary>
/// <param name="value">The string on which variable substitution is performed.</param>
/// <param name="props">The dictionary to use to lookup variables.</param>
/// <returns>The result of the substitutions.</returns>
/// <remarks>
/// <para>
/// The variable substitution delimiters are <b>${</b> and <b>}</b>.
/// </para>
/// <para>
/// For example, if props contains <c>key=value</c>, then the call
/// </para>
/// <para>
/// <code lang="C#">
/// string s = OptionConverter.SubstituteVariables("Value of key is ${key}.");
/// </code>
/// </para>
/// <para>
/// will set the variable <c>s</c> to "Value of key is value.".
/// </para>
/// <para>
/// If no value could be found for the specified key, then substitution
/// defaults to an empty string.
/// </para>
/// <para>
/// For example, if system properties contains no value for the key
/// "nonExistentKey", then the call
/// </para>
/// <para>
/// <code lang="C#">
/// string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]");
/// </code>
/// </para>
/// <para>
/// will set <s>s</s> to "Value of nonExistentKey is []".
/// </para>
/// <para>
/// An Exception is thrown if <paramref name="value"/> contains a start
/// delimiter "${" which is not balanced by a stop delimiter "}".
/// </para>
/// </remarks>
public static string SubstituteVariables(string value, System.Collections.IDictionary props)
{
StringBuilder buf = new StringBuilder();
int i = 0;
int j, k;
while(true)
{
j = value.IndexOf(DELIM_START, i);
if (j == -1)
{
if (i == 0)
{
return value;
}
else
{
buf.Append(value.Substring(i, value.Length - i));
return buf.ToString();
}
}
else
{
buf.Append(value.Substring(i, j - i));
k = value.IndexOf(DELIM_STOP, j);
if (k == -1)
{
throw new LogException("[" + value + "] has no closing brace. Opening brace at position [" + j + "]");
}
else
{
j += DELIM_START_LEN;
string key = value.Substring(j, k - j);
string replacement = props[key] as string;
if (replacement != null)
{
buf.Append(replacement);
}
i = k + DELIM_STOP_LEN;
}
}
}
}
#endregion Public Static Methods
#region Private Static Methods
/// <summary>
/// Converts the string representation of the name or numeric value of one or
/// more enumerated constants to an equivalent enumerated object.
/// </summary>
/// <param name="enumType">The type to convert to.</param>
/// <param name="value">The enum string value.</param>
/// <param name="ignoreCase">If <c>true</c>, ignore case; otherwise, regard case.</param>
/// <returns>An object of type <paramref name="enumType" /> whose value is represented by <paramref name="value" />.</returns>
private static object ParseEnum(System.Type enumType, string value, bool ignoreCase)
{
#if !NETCF
return Enum.Parse(enumType, value, ignoreCase);
#else
FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
string[] names = value.Split(new char[] {','});
for (int i = 0; i < names.Length; ++i)
{
names[i] = names [i].Trim();
}
long retVal = 0;
try
{
// Attempt to convert to numeric type
return Enum.ToObject(enumType, Convert.ChangeType(value, typeof(long), CultureInfo.InvariantCulture));
}
catch {}
foreach (string name in names)
{
bool found = false;
foreach(FieldInfo field in fields)
{
if (String.Compare(name, field.Name, ignoreCase) == 0)
{
retVal |= ((IConvertible) field.GetValue(null)).ToInt64(CultureInfo.InvariantCulture);
found = true;
break;
}
}
if (!found)
{
throw new ArgumentException("Failed to lookup member [" + name + "] from Enum type [" + enumType.Name + "]");
}
}
return Enum.ToObject(enumType, retVal);
#endif
}
#endregion Private Static Methods
#region Private Static Fields
private const string DELIM_START = "${";
private const char DELIM_STOP = '}';
private const int DELIM_START_LEN = 2;
private const int DELIM_STOP_LEN = 1;
#endregion Private Static Fields
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -