【问题标题】:Anonymous delegate Ref parameters [duplicate]匿名委托 Ref 参数 [重复]
【发布时间】:2020-01-26 17:55:07
【问题描述】:

我的情况是,我有事件委托提供的 ref 参数。 委托处理程序必须修改这些值并将它们提供给调用者。 问题是在某些情况下代码必须在特定用户下执行,所以我需要使用 WindowsIdentity.RunImpersonated

RunImpersonated 函数接受 Action 或 Func 形式的匿名委托。 问题是我不能将任何 ref 变量传递给这个动作或函数。 坚持使用 ref 的目的是我需要避免常量值复制,因为事件委托可能每秒被调用数千次。

我研究了这个主题,但似乎无法通过 ref 将参数传递给 RunImpersonated 操作。

这是问题的一个小例子。

    private void ByRef(ref int number)
    {
        var accessToken = WindowsIdentity.GetCurrent().AccessToken;
        WindowsIdentity.RunImpersonated(accessToken, () => 
        {
            //this will not work
            number = 200;
        });
    }

【问题讨论】:

    标签: c#


    【解决方案1】:

    看看this doc,你应该可以使用这个重载实现你想要的:RunImpersonated<T>(SafeAccessTokenHandle, Func<T>)

    您的代码如下所示:

        private void ByRef(ref int number)
        {
            var accessToken = WindowsIdentity.GetCurrent().AccessToken;
            number = WindowsIdentity.RunImpersonated<int>(accessToken, () => 
            {
                return 200;
            });
        }
    

    【讨论】:

    • RunImpersonated&lt;(int x, int y)&gt; 用于元组/多个参考参数。