133 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Reflection;
 | |
| 
 | |
| namespace Csla
 | |
| {
 | |
|   /// <summary>
 | |
|   /// Contains utility methods used by the
 | |
|   /// CSLA .NET framework.
 | |
|   /// </summary>
 | |
|   public static class Utilities
 | |
|   {
 | |
|     #region Replacements for VB runtime functionality
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Determines whether the specified
 | |
|     /// value can be converted to a valid number.
 | |
|     /// </summary>
 | |
|     public static bool IsNumeric(object value)
 | |
|     {
 | |
|       double dbl;
 | |
|       return double.TryParse(value.ToString(), System.Globalization.NumberStyles.Any,
 | |
|         System.Globalization.NumberFormatInfo.InvariantInfo, out dbl);
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Allows late bound invocation of
 | |
|     /// properties and methods.
 | |
|     /// </summary>
 | |
|     /// <param name="target">Object implementing the property or method.</param>
 | |
|     /// <param name="methodName">Name of the property or method.</param>
 | |
|     /// <param name="callType">Specifies how to invoke the property or method.</param>
 | |
|     /// <param name="args">List of arguments to pass to the method.</param>
 | |
|     /// <returns>The result of the property or method invocation.</returns>
 | |
|     public static object CallByName(
 | |
|       object target, string methodName, CallType callType, 
 | |
|       params object[] args)
 | |
|     {
 | |
|       switch (callType)
 | |
|       {
 | |
|         case CallType.Get:
 | |
|           {
 | |
|             PropertyInfo p = target.GetType().GetProperty(methodName);
 | |
|             return p.GetValue(target, args);
 | |
|           }
 | |
|         case CallType.Let:
 | |
|         case CallType.Set:
 | |
|           {
 | |
|             PropertyInfo p = target.GetType().GetProperty(methodName);
 | |
|             object[] index = null;
 | |
|             args.CopyTo(index, 1);
 | |
|             p.SetValue(target, args[0], index);
 | |
|             return null;
 | |
|           }
 | |
|         case CallType.Method:
 | |
|           {
 | |
|             MethodInfo m = target.GetType().GetMethod(methodName);
 | |
|             return m.Invoke(target, args);
 | |
|           }
 | |
|       }
 | |
|       return null;
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Returns a property's type, dealing with
 | |
|     /// Nullable(Of T) if necessary.
 | |
|     /// </summary>
 | |
|     /// <param name="propertyType">Type of the
 | |
|     /// property as returned by reflection.</param>
 | |
|     public static Type GetPropertyType(Type propertyType)
 | |
|     {
 | |
|       Type type = propertyType;
 | |
|       if (type.IsGenericType &&
 | |
|         (type.GetGenericTypeDefinition() == typeof(Nullable<>)))
 | |
|         return Nullable.GetUnderlyingType(type);
 | |
|       return type;
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Returns the type of child object
 | |
|     /// contained in a collection or list.
 | |
|     /// </summary>
 | |
|     /// <param name="listType">Type of the list.</param>
 | |
|     public static Type GetChildItemType(Type listType)
 | |
|     {
 | |
|       Type result = null;
 | |
|       if (listType.IsArray)
 | |
|         result = listType.GetElementType();
 | |
|       else
 | |
|       {
 | |
|         DefaultMemberAttribute indexer =
 | |
|           (DefaultMemberAttribute)Attribute.GetCustomAttribute(
 | |
|           listType, typeof(DefaultMemberAttribute));
 | |
|         if (indexer != null)
 | |
|           foreach (PropertyInfo prop in listType.GetProperties(
 | |
|             BindingFlags.Public | 
 | |
|             BindingFlags.Instance | 
 | |
|             BindingFlags.FlattenHierarchy))
 | |
|           {
 | |
|             if (prop.Name == indexer.MemberName)
 | |
|               result = Utilities.GetPropertyType(prop.PropertyType);
 | |
|           }
 | |
|       }
 | |
|       return result;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /// <summary>
 | |
|   /// Valid options for calling a property or method
 | |
|   /// via the <see cref="Csla.Utilities.CallByName"/> method.
 | |
|   /// </summary>
 | |
|   public enum CallType
 | |
|   {
 | |
|     /// <summary>
 | |
|     /// Gets a value from a property.
 | |
|     /// </summary>
 | |
|     Get,
 | |
|     /// <summary>
 | |
|     /// Sets a value into a property.
 | |
|     /// </summary>
 | |
|     Let,
 | |
|     /// <summary>
 | |
|     /// Invokes a method.
 | |
|     /// </summary>
 | |
|     Method,
 | |
|     /// <summary>
 | |
|     /// Sets a value into a property.
 | |
|     /// </summary>
 | |
|     Set
 | |
|   }
 | |
| }
 |