Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过动态lambda和IL创建对象的新实例?_C#_Delegates_Lambda_Expression_Il - Fatal编程技术网

C# 如何通过动态lambda和IL创建对象的新实例?

C# 如何通过动态lambda和IL创建对象的新实例?,c#,delegates,lambda,expression,il,C#,Delegates,Lambda,Expression,Il,我知道Activator.CreateInstance()可以创建对象的新实例。但是我正在寻找一种通过IL和Expression创建实例的方法。我想我可以创建一个动态lambda来创建一个类型的实例,并缓存lambda来加速对象初始化。我说得对吗?您能帮助我吗?您可以使用表示对象的创建。您可以向它传递具有无参数构造函数的类型,或者传递构造函数信息,以及表示构造函数参数的表达式。如果要返回一个对象,并且希望它也适用于值类型,则还需要添加一个表达式。Convert() 综上所述,相当于Activat

我知道
Activator.CreateInstance()
可以创建
对象的新实例。但是我正在寻找一种通过
IL
Expression
创建实例的方法。我想我可以创建一个动态lambda来创建一个类型的实例,并缓存lambda来加速对象初始化。我说得对吗?您能帮助我吗?

您可以使用表示对象的创建。您可以向它传递具有无参数构造函数的
类型
,或者传递
构造函数信息
,以及表示构造函数参数的
表达式。如果要返回一个
对象
,并且希望它也适用于值类型,则还需要添加一个
表达式。Convert()

综上所述,相当于
Activator.CreateInstance()
的代码可能如下所示:

object CreateInstance(Type type)
{
    return Expression.Lambda<Func<object>>(
        Expression.Convert(Expression.New(type), typeof(object)))
        .Compile()();
}

可以使用来表示对象的创建。您可以向它传递具有无参数构造函数的
类型
,或者传递
构造函数信息
,以及表示构造函数参数的
表达式。如果要返回一个
对象
,并且希望它也适用于值类型,则还需要添加一个
表达式。Convert()

综上所述,相当于
Activator.CreateInstance()
的代码可能如下所示:

object CreateInstance(Type type)
{
    return Expression.Lambda<Func<object>>(
        Expression.Convert(Expression.New(type), typeof(object)))
        .Compile()();
}

谢谢,我明白了。那么,如果constractor有一些参数,我如何提供主题呢?另一个问题是,我在哪里可以了解
表达式
?你在哪里学的?提前感谢您需要了解的关于各种.Net类型的所有信息,包括。正如我所说,您可以将参数作为
New()
方法的参数提供给构造函数,可能使用
Expression.Constant()
。谢谢我理解它。那么,如果constractor有一些参数,我如何提供主题呢?另一个问题是,我在哪里可以了解
表达式
?你在哪里学的?提前感谢您需要了解的关于各种.Net类型的所有信息,包括。正如我所说,您可以向构造函数提供参数作为
New()
方法的参数,可能使用
Expression.Constant()