Reflector : Type « Reflection « C# / C Sharp






Reflector

       
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Linq.Expressions;
using System.IO;
using System.Web;


namespace PK.Utilities.Reflection
{
    public class Reflector
    {
        private delegate T ObjectActivator<T>(params object[] args);

        /// <summary>
        /// Create an instance from an object using reflection and linq expressions. Works for every constructor
        /// </summary>
        /// <typeparam name="T">The type of the object to instance</typeparam>
        /// <param name="assemblyName">The name of the assembly who stores the type</param>
        /// <param name="typeFullName">The fullname of the type to instanciate</param>
        /// <param name="args">The arguments of the constructor</param>
        /// <returns>An instance of the given type</returns>
        public static T GetInstance<T>(string assemblyName, string typeFullName, params object[] args)
        {
            T res = default(T);
            //var completeAssemblyName =Path.Combine(GetRunningPath(),  assemblyName + (assemblyName.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) ? "" : ".dll"));

            Assembly assembly = Assembly.Load(GetAssemblyName(assemblyName));
            Type type = assembly.GetType(typeFullName);

            ConstructorInfo ctor = GetConstructor(args, type);

            ObjectActivator<T> createdActivator = GetActivator<T>(ctor);

            res = createdActivator(args);

            return res;
        }

        private static AssemblyName GetAssemblyName(string assemblyName)
        {
            var name = new AssemblyName(assemblyName);

            return name;
        }

        private static ConstructorInfo GetConstructor(object[] args, Type type)
        {
            if (args == null)
                args = new object[0];
            ConstructorInfo ctor = type.GetConstructor(args.Select(o => o.GetType()).ToArray());
            return ctor;
        }

        /// <summary>
        ///  Create an instance from an object using reflection and linq expressions. Works for every constructor
        /// </summary>
        /// <typeparam name="T">The type of the object to instance</typeparam>
        /// <param name="type">A Type object containing the object type to instantiate</param>
        /// <param name="args">The arguments of the constructor</param>
        /// <returns>An instance of the given type</returns>
        public static T GetInstance<T>(Type type, params object[] args)
        {
            T res = default(T);
            ConstructorInfo ctor = GetConstructor(args, type);

            ObjectActivator<T> createdActivator = GetActivator<T>(ctor);

            res = createdActivator(args);

            return res;
        }

        /// <summary>
        /// Create an instance from an object using reflection and linq expressions. Uses the default constructor.
        /// </summary>
        /// <typeparam name="T">The type of the object to instance</typeparam>
        /// <param name="assemblyName">The name of the assembly who stores the type</param>
        /// <param name="typeFullName">The fullname of the type to instanciate</param>
        /// <returns>An instance of the given type</returns>
        public static T GetInstance<T>(string assemblyName, string typeFullName)
        {
            return GetInstance<T>(assemblyName, typeFullName, new object[] { });
        }

        /// <summary>
        /// Create an instance from an object using reflection and linq expressions. Uses the default constructor.
        /// </summary>
        /// <typeparam name="T">The type of the object to instance</typeparam>
        /// <param name="fullTypeName">The string with full type name and asembly, in format "fullName, Assembly"</param>
        /// <returns>An instance of the given type</returns>
        public static T GetInstance<T>(string fullTypeName)
        {
            var values = fullTypeName.Split(new char[]{','}, 2 );
            return GetInstance<T>(values[1].Trim(), values[0].Trim(), new object[] { });
        }

        /// <summary>
        /// Creates an ObjectActivator specifyc for an object type and a constructor type
        /// </summary>
        /// <typeparam name="T">Type of the object to get an instance for</typeparam>
        /// <param name="ctor">ContructorInfo containing detail information for an specicyc contrustor</param>
        /// <returns>An delegate of the compiled ObjectActivator method</returns>
        private static ObjectActivator<T> GetActivator<T>(ConstructorInfo ctor)
        {
            ParameterInfo[] paramsInfo = ctor.GetParameters();

            //create a single param of type object[]
            ParameterExpression param = Expression.Parameter(typeof(object[]), "args");

            Expression[] argsExp = new Expression[paramsInfo.Length];

            //pick each arg from the params array 
            //and create a typed expression of them
            for (int i = 0; i < paramsInfo.Length; i++)
            {
                Expression index = Expression.Constant(i);
                Type paramType = paramsInfo[i].ParameterType;

                Expression paramAccessorExp = Expression.ArrayIndex(param, index);

                Expression paramCastExp = Expression.Convert(paramAccessorExp, paramType);

                argsExp[i] = paramCastExp;
            }

            //make a NewExpression that calls the
            //ctor with the args we just created
            NewExpression newExp = Expression.New(ctor, argsExp);

            //create a lambda with the New
            //Expression as body and our param object[] as arg
            LambdaExpression lambda = Expression.Lambda(typeof(ObjectActivator<T>), newExp, param);

            //compile it
            ObjectActivator<T> compiled = (ObjectActivator<T>)lambda.Compile();
            return compiled;
        }

    }
}

   
    
    
    
    
    
    
  








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 AssemblyDeeper 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 nameCreate 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.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.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.Is Type a primitive type
61.Find Method With One Parameter Of Type
62.Determines whether the current type is an implementation of the specified interface.
63.Returns equality with type conversion
64.Groups the utility methods that extracts the meta data of a type.
65.Type loader
66.Get Friendly Type Name
67.Recursively gets all generic type params in any given type definition.
68.Type Manager
69.Given an anonymous type
70.Type Normalizer
71.Run static/Instance method
72.Get Subclass