Type Normalizer
#region Copyright note and modification history
/*
-----------------------------------------------------------------------------
Copyright (c) 2006 HSI Inc. All Rights Reserved.
PROPRIETARY NOTICE: This software has been provided pursuant to a
License Agreement that contains restrictions on its use. This software
contains valuable trade secrets and proprietary information of
HSI Inc and is protected by Federal copyright law. It may not
be copied or distributed in any form or medium, disclosed to third parties,
or used in any manner that is not provided for in said License Agreement,
except with the prior written authorization of HSI Inc.
-----------------------------------------------------------------------------
$Log: /CoreServices/Hsi/ExpressionEvaluator/TypeNormalizer.cs $
*
* 4 9/27/07 9:20a Nathan_stults
*
* 3 9/26/06 4:16p Nathan_stults
*
* 2 8/23/06 8:52a Alex_wang
* MOdified NormalizedTypes() method to throw exception if conversion
* fails.
-----------------------------------------------------------------------------
*/
#endregion
using System;
using System.ComponentModel;
namespace SimpleExpressionEvaluator.Utilities
{
/// <summary>
/// Summary description for TypeNormalizer.
/// </summary>
public class TypeNormalizer
{
public static void NormalizeTypes(ref object left,ref object right)
{
NormalizeTypes(ref left,ref right,0);
}
public static void NormalizeTypes(ref object left,ref object right,object nullValue)
{
if (left == null)
left = 0;
if (right == null)
right = 0;
if (left.GetType() == right.GetType())
return;
try
{
right = Convert.ChangeType(right,left.GetType());
}
catch
{
try
{
left = Convert.ChangeType(left, right.GetType());
}
catch
{
throw new Exception(String.Format("Error converting from {0} type to {1}", left.GetType().FullName, right.GetType().FullName));
}
}
}
public static void EnsureTypes(ref object[] values,Type targetType)
{
object nullValue = null;
if (targetType.IsValueType)
nullValue = Activator.CreateInstance(targetType);
EnsureTypes(ref values,targetType,nullValue);
}
public static void EnsureTypes(ref object[] values,Type targetType,object nullValue)
{
for (int i=0;i<values.Length;i++)
{
values[i] = EnsureType(values[i],targetType,nullValue);
}
}
public static T EnsureType<T>(object value)
{
return EnsureType<T>(value, default(T));
}
public static T EnsureType<T>(object value,object nullValue)
{
return (T) EnsureType(value, typeof (T), nullValue);
}
public static object EnsureType(object value, Type targetType)
{
if (value != null && value.GetType() == targetType)
return value;
object defaultValue = null;
if (targetType.IsValueType)
defaultValue = Activator.CreateInstance(targetType);
return EnsureType(value, targetType, defaultValue);
}
public static object EnsureType(object value,Type targetType,object nullValue)
{
if (value == null)
return nullValue;
if (targetType == typeof(object))
return value;
if (value.GetType() == targetType)
return value;
TypeConverter converter = TypeDescriptor.GetConverter(targetType);
if (converter != null && converter.CanConvertFrom(value.GetType()))
return converter.ConvertFrom(value);
try
{
return Convert.ChangeType(value, targetType);
}
catch
{ }
return nullValue;
}
}
}
Related examples in the same category
1. | Call GetType() from StringBuilder | | |
2. | Call GetType for int data type | | |
3. | IsGeneric and IsGenericTypeDefinition | | |
4. | demonstrates both the instance and static GetType methods | | |
5. | Generic methods, like nongeneric methods, can be invoked dynamically at run time. | | |
6. | Type.GetGenericArguments and MethodInfo.GetGenericArguments: | | |
7. | Get Generic Type Definition | | |
8. | Query properties of a Type | | |
9. | Deeper Reflection:Listing All the Types in an Assembly | | |
10. | Illustrates runtime type creation | | |
11. | The typeName parameter is a combination of the Assembly and Type names | | |
12. | Call static method GetType from Type to get the Type instance | | |
13. | Use GetCustomAttributes from Type to get custom attributes | | |
14. | Use Type.GetType to check the type of an object | | |
15. | Get object Type Name, UnderlyingSystemType, IsClass | | |
16. | Type.GetConstructors | | |
17. | Use Type.IsClass to check if a type is a class | | |
18. | Print Types | | |
19. | Determining the base classes and interfaces for a class. | | |
20. | Create Object from assembly name and class name | | |
21. | Makes a shallow copy of the object to a different class type (inherits from the original) | | |
22. | Makes a shallow copy of the object | | |
23. | Get all methods from an object | | |
24. | Get Derivation from an object | | |
25. | The full name of the Array type | | |
26. | Change type | | |
27. | Does a given Type have a Default Constructor | | |
28. | Is it a Nullable Type | | |
29. | Is Value Type Unitialized Value | | |
30. | Get Type Unitialized Value | | |
31. | Is Object Unitialized Value | | |
32. | Is it a SubClass for another class | | |
33. | Convert type from initial Value | | |
34. | Returns all assemblies and their properties | | |
35. | Helper to display the "contents" of the Value Object | | |
36. | Get a public field value given its name | | |
37. | Deep Comparison two objects if they are alike. | | |
38. | Set the specified public field value of an object | | |
39. | Determine if a type is cloneable: either a value type or implementing ICloneable. | | |
40. | Provides a simple reflection based mapper to perform a Data Mapping between two types of objects | | |
41. | Represents type declarations: class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types. | | |
42. | Gets the attributes associated with the Type. | | |
43. | Gets the type from which the current Type directly inherits. | | |
44. | Gets a value indicating whether the current Type object has type parameters that have not been replaced by specific types. | | |
45. | Gets the type that declares the current nested type or generic type parameter. | | |
46. | Gets a reference to the default binder. | | |
47. | Represents the member filter used on attributes. | | |
48. | Returns an array of Type objects representing a filtered list of interfaces implemented or inherited by the current Type. | | |
49. | Returns a filtered array of MemberInfo objects of the specified member type. | | |
50. | Gets the number of dimensions in an Array. | | |
51. | Searches for the members defined for the current Type whose DefaultMemberAttribute is set. | | |
52. | Type.GetElementType | | |
53. | Returns a Type object that represents a generic type definition from which the current generic type can be constructed. | | |
54. | Searches for the interface with the specified name. | | |
55. | Get types implementing Dictionary | | |
56. | Returns all the public properties of the current Type. | | |
57. | Type to string | | |
58. | Get Full Type String | | |
59. | Get class members | | |
60. | Reflector | | |
61. | Is Type a primitive type | | |
62. | Find Method With One Parameter Of Type | | |
63. | Determines whether the current type is an implementation of the specified interface. | | |
64. | Returns equality with type conversion | | |
65. | Groups the utility methods that extracts the meta data of a type. | | |
66. | Type loader | | |
67. | Get Friendly Type Name | | |
68. | Recursively gets all generic type params in any given type definition. | | |
69. | Type Manager | | |
70. | Given an anonymous type | | |
71. | Run static/Instance method | | |
72. | Get Subclass | | |