在运行时使用 ref 参数创建 C# 委托类型

发布于 2024-10-30 14:44:06 字数 623 浏览 6 评论 0原文

我需要在运行时创建带有 ref 参数的委托类型。

如果我在编译时知道参数类型,我可以使用显式委托类型声明,例如:

// S is some struct / value type, e.g. int or Guid
delegate void VoidDelSRef (ref S s);
Type td = typeof (VoidDelSRef);

该类型 td 用于创建 C#4 表达式树,该树被编译为一名代表。

由于表达式树中的代码修改了参数 s,因此我需要通过引用传递 s

我必须支持任何类型 S,因此我无法使用显式委托类型声明,因为我只有 Type ts = typeof (S) 及其 ref 类型 Type tsr = ts.MakeByRefType ()

我尝试使用 Expression.GetActionType (tsr),但它不允许 ref 类型。

如何在运行时使用 ref 参数构建委托?

I need to create a delegate type with a ref parameter at runtime.

If I knew the parameter type(s) at compile time, I could use an explicit delegate type declaration, for example:

// S is some struct / value type, e.g. int or Guid
delegate void VoidDelSRef (ref S s);
Type td = typeof (VoidDelSRef);

That type td is used to create a C#4 expression tree, which is compiled into a delegate.

Since the code in my expression tree modifies the parameter s, I need to pass s by reference.

I have to support any type S, so I can't use an explicit delegate type declaration, because I only have Type ts = typeof (S) and its ref type Type tsr = ts.MakeByRefType ().

I tried to use Expression.GetActionType (tsr), but it does not allow ref types.

How do I build a delegate with ref parameters at runtime ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

究竟谁懂我的在乎 2024-11-06 14:44:06

在 .NET 4 中,您可以使用 Expression.GetDelegateType 方法。与 GetActionType 不同,它可以很好地处理 ByRef 类型。

例如:

// void MyDelegate(ref int arg)
var delType = Expression.GetDelegateType(typeof(int).MakeByRefType(), 
                                         typeof(void));

如果您使用的是.NET 3.5,则此方法不可用。如果您想复制其功能,我建议您查看其实现(使用反编译器)。它没有太多的依赖;这绝对是可行的。

In .NET 4, you can use the Expression.GetDelegateType method. Unlike GetActionType, it works fine with ByRef types.

E.g.:

// void MyDelegate(ref int arg)
var delType = Expression.GetDelegateType(typeof(int).MakeByRefType(), 
                                         typeof(void));

If you are on .NET 3.5, this method is not available. I recommend taking a look at its implementation (with a decompiler) if you want to replicate its functionality. It doesn't have too many dependencies; it's definitely doable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文