`

C# 泛型 Generics 创建带参对象(取代反射创建对象 优化性能)

阅读更多

需求:使用泛型创建有参数的对象(性能上考虑,不使用反射创建)。

使用泛型创建无参(默认)构造函数的对象可以用
where :T ,new()
new T();
来实现,但是如果构造函数带有参数怎么办呢?

于是就写了一下一段代码:
这里使用了Expression 和 LambdaExpression,目的是为了生成对应类构造函数的委托 ,所以第一次调用会相对慢一点,随后调用就像直接new一样快,适合多次调用情况。

 

 

 

 

using System;
using System.Linq.Expressions;
using System.Reflection;

namespace XXX
{


    /// <summary>
    /// ObjectCreator class used to create object at runtime.
    /// </summary>
    public class ObjectCreator<T>
    {
        #region Singleton
        private ObjectCreator() { }
        public static ObjectCreator<T> Instance
        {
            get { return Nested.m_instance; }
        }
        private class Nested
        {
            static Nested() { }
            internal static readonly ObjectCreator<T> m_instance = new ObjectCreator<T>();
        }
        #endregion

        private ObjectActivator m_rowCreatedActivator = null;

        /// <summary>
        /// Constructor of delegate
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="args">arguments of Constructor</param>
        /// <returns>Type</returns>
        private delegate T ObjectActivator(params object[] args);

        public T Create(Type[] types, params object[] args)
        {
            if (null == m_rowCreatedActivator)
            {
                m_rowCreatedActivator = ObjectCreator<T>.Instance.GetActivator(typeof(T).GetConstructor(types));
            }
            return m_rowCreatedActivator(args);
        }

        /// <summary>
        /// Create object type at runtime.
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="ctor">ConstructorInfo of Type</param>
        /// <returns>Constructor of delegate</returns>
        private ObjectActivator GetActivator(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), newExp, param);

            //compile it
            ObjectActivator compiled = (ObjectActivator)lambda.Compile();
            return compiled;
        }
    }
}
0
0
分享到:
评论

相关推荐

    C#泛型、反射实例、自动生成sql语句

    在.NET编程环境中,C#是一种强大的面向对象的编程语言,其特性和功能使得开发者能够创建高效、可维护的代码。本篇文章将详细探讨C#中的泛型、反射以及如何利用这些特性来实现自动生成SQL语句。 **一、C# 泛型** ...

    利用反射生成泛型类对象

    反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool&lt;Point&gt; pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...

    C#泛型类、泛型方法、泛型接口、泛型委托的实例

    在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...

    .net,C# 泛型示例代码,.net,C# 泛型示例代码

    .net,C# 泛型示例代码.net,C# 泛型示例代码.net,C# 泛型示例代码

    C#泛型相关讲解

    C# 泛型是一种强大的编程工具,它允许开发者创建可重用的类型化代码,这些代码可以在多种数据类型上工作,而无需重复编写针对每种数据类型的具体版本。泛型的主要目标是提高代码的效率、灵活性和安全性。在C#中,...

    C#泛型集合使用实例

    总的来说,C#泛型集合提供了一种强大的方式来处理和管理不同类型的数据,其类型安全性和性能优化使得它成为C#开发中不可或缺的一部分。无论是在简单的数据存储还是复杂的数据操作场景,泛型集合都能提供高效且简洁的...

    个人学习C#泛型总结ppt

    C#泛型是一种强大的编程工具,它为C#程序员提供了更大的灵活性和性能优化。泛型在.NET Framework 2.0中被引入,旨在解决传统集合类(如ArrayList)在处理不同类型数据时存在的性能和类型安全问题。以下是关于C#泛型...

    C#泛型实例Demo

    C#泛型是一种强大的编程工具,它允许在不指定具体数据类型的情况下定义类、接口和方法。这使得代码更具灵活性,同时保持了编译时类型安全性和运行时的高效性。在C#中,泛型主要体现在以下几个方面:泛型类、泛型接口...

    c# 泛型应用实例

    在C#(Visual Studio 2008及更高版本)中,泛型提供了类型安全性和性能优势,因为它们避免了在运行时进行不必要的类型转换。下面将详细介绍C#泛型的应用实例。 1. **泛型类**:泛型类是在定义时未指定类型的类,如`...

    C# 泛型 C# 泛型

    C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。泛型提高了代码的效率、安全性和灵活性,避免了不必要的类型转换,并提供了更强的类型检查。在C#中,泛型...

    C#泛型 调研报告 C#泛型

    - **性能提升**:由于泛型的类型信息在运行时可用,编译器能够生成更优化的IL代码,避免了类型转换的开销,从而提升了执行效率。 - **代码复用**:泛型类和方法可以在多种数据类型上重复使用,减少了代码量,提高...

    C#的泛型C#的泛型

    C#的泛型是一种强大的功能,它允许程序员创建能够处理任何数据类型的类、接口或方法。通过泛型,可以在编写一次代码的基础上处理多种不同类型的对象,提高了代码的灵活性与重用性。泛型的关键在于“参数化类型”,即...

    C#泛型类创建的链表

    泛型类创建的链表是利用C#的泛型功能来实现数据结构中的链表,这种链表可以存储任何类型的元素,而不仅仅是特定类型。这大大提高了代码的灵活性和效率。下面我们将深入探讨C#泛型类以及如何用其构建链表。 首先,让...

    C#泛型集合与非泛型集合

    2. **性能优化**:泛型集合避免了装箱和拆箱操作,直接操作值类型,从而提高了程序的执行效率。 #### 四、案例分析 为了更好地理解泛型集合与非泛型集合之间的差异,我们来看一个具体的例子。假设我们需要创建一个...

    DataReader反射泛型实体对象

    3. **泛型**: 泛型是.NET Framework的一项功能,它允许在类型安全的前提下创建可重用的组件,避免了装箱和拆箱操作,提高了性能。在我们的例子中,泛型用于创建一个函数,该函数可以处理任何类型的实体对象,只要...

    高级无敌,c#泛型例子

    2. **性能优化**:泛型类在实例化时会针对具体类型进行优化,避免了不必要的装箱和拆箱操作,提高了程序执行效率。 3. **代码复用**:通过泛型,开发者可以编写一次代码,用于处理多种类型的数据,降低了代码的重复...

    C#中通过反射操作泛型

    在C#中通过反射操作一个List泛型。。

    C#泛型,非泛型实现枚举

    在C#中,泛型允许我们创建可重用的数据结构和方法,这些结构和方法可以操作任何数据类型。这大大提高了代码的灵活性和类型安全性。例如,`List&lt;T&gt;`就是一个泛型类,其中`T`代表一个未指定的类型,实际使用时可以是...

    C#泛型接口实例

    在C#编程语言中,泛型接口是一种强大的工具,它允许开发者定义一组可以在不同数据类型上操作的方法。泛型接口的使用可以极大地提高代码的复用性和灵活性,同时确保类型安全。下面我们将深入探讨C#泛型接口的概念、...

Global site tag (gtag.js) - Google Analytics