需求:使用泛型创建有参数的对象(性能上考虑,不使用反射创建)。
使用泛型创建无参(默认)构造函数的对象可以用
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;
}
}
}
分享到:
相关推荐
在.NET编程环境中,C#是一种强大的面向对象的编程语言,其特性和功能使得开发者能够创建高效、可维护的代码。本篇文章将详细探讨C#中的泛型、反射以及如何利用这些特性来实现自动生成SQL语句。 **一、C# 泛型** ...
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
在C#编程中,泛型是一种强大的工具,它允许我们编写可重用的代码,同时保持类型安全性和高效性。本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类...
.net,C# 泛型示例代码.net,C# 泛型示例代码.net,C# 泛型示例代码
C# 泛型是一种强大的编程工具,它允许开发者创建可重用的类型化代码,这些代码可以在多种数据类型上工作,而无需重复编写针对每种数据类型的具体版本。泛型的主要目标是提高代码的效率、灵活性和安全性。在C#中,...
总的来说,C#泛型集合提供了一种强大的方式来处理和管理不同类型的数据,其类型安全性和性能优化使得它成为C#开发中不可或缺的一部分。无论是在简单的数据存储还是复杂的数据操作场景,泛型集合都能提供高效且简洁的...
C#泛型是一种强大的编程工具,它为C#程序员提供了更大的灵活性和性能优化。泛型在.NET Framework 2.0中被引入,旨在解决传统集合类(如ArrayList)在处理不同类型数据时存在的性能和类型安全问题。以下是关于C#泛型...
C#泛型是一种强大的编程工具,它允许在不指定具体数据类型的情况下定义类、接口和方法。这使得代码更具灵活性,同时保持了编译时类型安全性和运行时的高效性。在C#中,泛型主要体现在以下几个方面:泛型类、泛型接口...
在C#(Visual Studio 2008及更高版本)中,泛型提供了类型安全性和性能优势,因为它们避免了在运行时进行不必要的类型转换。下面将详细介绍C#泛型的应用实例。 1. **泛型类**:泛型类是在定义时未指定类型的类,如`...
C# 泛型是.NET框架中的一个重要特性,它允许开发者创建可重用的类型化代码,这些代码可以处理多种数据类型。泛型提高了代码的效率、安全性和灵活性,避免了不必要的类型转换,并提供了更强的类型检查。在C#中,泛型...
- **性能提升**:由于泛型的类型信息在运行时可用,编译器能够生成更优化的IL代码,避免了类型转换的开销,从而提升了执行效率。 - **代码复用**:泛型类和方法可以在多种数据类型上重复使用,减少了代码量,提高...
C#的泛型是一种强大的功能,它允许程序员创建能够处理任何数据类型的类、接口或方法。通过泛型,可以在编写一次代码的基础上处理多种不同类型的对象,提高了代码的灵活性与重用性。泛型的关键在于“参数化类型”,即...
泛型类创建的链表是利用C#的泛型功能来实现数据结构中的链表,这种链表可以存储任何类型的元素,而不仅仅是特定类型。这大大提高了代码的灵活性和效率。下面我们将深入探讨C#泛型类以及如何用其构建链表。 首先,让...
2. **性能优化**:泛型集合避免了装箱和拆箱操作,直接操作值类型,从而提高了程序的执行效率。 #### 四、案例分析 为了更好地理解泛型集合与非泛型集合之间的差异,我们来看一个具体的例子。假设我们需要创建一个...
3. **泛型**: 泛型是.NET Framework的一项功能,它允许在类型安全的前提下创建可重用的组件,避免了装箱和拆箱操作,提高了性能。在我们的例子中,泛型用于创建一个函数,该函数可以处理任何类型的实体对象,只要...
2. **性能优化**:泛型类在实例化时会针对具体类型进行优化,避免了不必要的装箱和拆箱操作,提高了程序执行效率。 3. **代码复用**:通过泛型,开发者可以编写一次代码,用于处理多种类型的数据,降低了代码的重复...
在C#中通过反射操作一个List泛型。。
在C#中,泛型允许我们创建可重用的数据结构和方法,这些结构和方法可以操作任何数据类型。这大大提高了代码的灵活性和类型安全性。例如,`List<T>`就是一个泛型类,其中`T`代表一个未指定的类型,实际使用时可以是...
在C#编程语言中,泛型接口是一种强大的工具,它允许开发者定义一组可以在不同数据类型上操作的方法。泛型接口的使用可以极大地提高代码的复用性和灵活性,同时确保类型安全。下面我们将深入探讨C#泛型接口的概念、...