c# - 仅使用类型的类型制作编译的构造函数表达式

标签 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.Lambda<Func<TConcrete>>(Expression.New(ctor));
    return lambda.Compile();
}

我相信这会返回一个很好的类型化委托(delegate),我可以用它来实例化传递的类型。

现在考虑一下,我想要一个可以为一组不同类型执行此操作的函数,我该怎么做?我在想……

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();
    }
}

正如您从 ???? 中看到的那样,这就是我卡住的地方。有没有办法做到这一点,还是我的方法有缺陷?

最佳答案

您可以使用不同的 Expression.Lambda 将委托(delegate)类型作为 Type 的调用:

Type delegateType = typeof(Func<>).MakeGenericType(type);
var lambda = Expression.Lambda(delegateType, Expression.New(ctor));
yield return lambda.Compile();

请注意 Lambda 的重载返回非泛型 LambdaExpression 输入而不是 Expression<TDelegate> - 但它仍然暴露一个 Compile 返回 Delegate 的方法,这就是您在这里所需要的。基本上,它只是避免了您在“已知委托(delegate)类型”代码中受益的一些编译时类型检查。

关于c# - 仅使用类型的类型制作编译的构造函数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143029/

相关文章:

c# - DataTable 表达式无法解释标记 '!'

c# - 如何检索字典 <?,?> 中包含的所有键值对?

android - Kotlin 反射的 ProGuard 规则

C# 委托(delegate)给具有不同可选参数的方法

ios - 协议(protocol)委托(delegate)始终为零

c# - 为扩展方法创建特定于硬件的委托(delegate)

c# - 将列表项从 c# 传递到 javascript 数组

javascript 转义字符串未使用 c# regex.Unescape() 进行转义

c# - 确保所有线程都关闭或强行关闭一个线程?

c - 在 C 中在运行时获取变量的类型