C# 仅使用类型的类型生成编译的构造函数表达式

C# 仅使用类型的类型生成编译的构造函数表达式,c#,reflection,delegates,lambda,C#,Reflection,Delegates,Lambda,我一直在玩,部分地改造轮子,以便我能理解正确的轮子是如何旋转的 考虑使用此泛型函数编译和返回类型的默认构造函数 public static Func<TConcrete> Creator<TConcrete>() { // All checking removed for brevity var ctor = typeof(TConcrete).GetConstructor(new Type[0]); var lambda = Expression

我一直在玩,部分地改造轮子,以便我能理解正确的轮子是如何旋转的

考虑使用此泛型函数编译和返回类型的默认构造函数

public static Func<TConcrete> Creator<TConcrete>()
{
    // All checking removed for brevity
    var ctor = typeof(TConcrete).GetConstructor(new Type[0]);
    var lambda = Expression.Lambda<Func<TConcrete>>(Expression.New(ctor));
    return lambda.Compile();
}
public static Func Creator()
{
//为了简洁起见,删除了所有检查
var-ctor=typeof(TConcrete).GetConstructor(新类型[0]);
var lambda=Expression.lambda(Expression.New(ctor));
返回lambda.Compile();
}
我相信这将返回一个很好的类型化委托,我可以用它来实例化传递的类型

现在考虑一下,我想要一个函数来处理一组不同的类型,我会怎么做呢?我是沿着

public static IEnumerable<Delegate> Creators(IEnumerable<Type> types)
{
    foreach (var type in types)
    {
        var ctor = type.GetConstructor(new Type[0]);
        var lamda = Expression.Lambda<Func<????>>(Expression.New(ctor));
        yield return lambda.Compile();
    }
}
公共静态IEnumerable创建者(IEnumerable类型)
{
foreach(类型中的变量类型)
{
var-ctor=type.GetConstructor(新类型[0]);

var lamda=Expression.Lambda将非泛型重载与
MakeGenericType
结合使用:

var lamda = Expression.Lambda<Func<????>>(Expression.New(ctor));
Type delegateType = typeof(Func<>).MakeGenericType(type);
var lambda = Expression.Lambda(delegateType, Expression.New(ctor));
yield return lambda.Compile();
var lamda=Expression.Lambda您可以使用不同的调用,该调用将委托类型作为
类型

var lamda = Expression.Lambda<Func<????>>(Expression.New(ctor));
Type delegateType = typeof(Func<>).MakeGenericType(type);
var lambda = Expression.Lambda(delegateType, Expression.New(ctor));
yield return lambda.Compile();
Type delegateType=typeof(Func)。MakeGenericType(Type);
var lambda=Expression.lambda(delegateType,Expression.New(ctor));
产生返回lambda.Compile();

请注意,
Lambda
重载返回非泛型类型,而不是
表达式
——但它仍然公开了一个返回
委托
的方法,这正是您在这里所需要的。基本上,它只是避免了一些编译时类型检查,您可以从“已知委托类型”中受益代码。

调用
创建者
方法并使用返回的委托的代码是什么样子的?@dtb,该代码实际上并不存在,我的程序实际上有一个函数,它使用
IEnumerable
来传递接口和具体实现之间的关联,但我认为这对我的实际任务是多余的真的,谢谢你。我应该在那里花些时间阅读我的智能感知。