小编jwi*_*ize的帖子

了解Expression.Invoke()方法

我一直在理解PredicateBuilderJoseph Albahari编写的扩展方法,我看到了这一点Expression.Invoke,说实话,我无法理解它的原因在以下方法中:

public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> 
       expr1, Expression<Func<T, bool>> expr2)
{
  var invokedExpr = Expression.Invoke (expr2, 
      expr1.Parameters.Cast<Expression> ());

  return Expression.Lambda<Func<T, bool>> 
       (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}
Run Code Online (Sandbox Code Playgroud)

即使他解释了一下:

有趣的工作发生在And和Or方法中.我们首先使用第一个表达式的参数调用第二个表达式.Invoke表达式使用给定表达式作为参数调用另一个lambda表达式.我们可以从第一个表达式的主体和第二个表达式的调用版本创建条件表达式.最后一步是将它包装在一个新的lambda表达式中.

MSDN告诉我:

创建一个InvocationExpression,将委托或lambda表达式应用于参数表达式列表.

这对我来说很有意义.所以基本上我不必传入任何参数,如果我使用这样的表达式.

但由于某种原因,我无法理解它.也许我累了什么的.

问题:

  1. 何时以及在何种情况下使用是有意义的InvocationExpression.
  2. 任何人都可以解释Or<T>方法(或AndElse<T>)方法如何更好地工作?

更新:

我在考虑InvocationExpression当我从工作到家时,它在我心中暗示如下:

当我们调用一个方法时,我们简单地说CallMe(phoneNumber, time);,这称为方法调用.然后,InvocationExpression应该是一个表达的表达CallMe(phoneNumber, time);.它类似于LambdaExpression表达lambda等t => t + 2.所以基本上它是一个应用于参数(而不是参数)的方法调用.因此,作为调用,不再需要参数,但可能会返回一些内容,因为参数已经应用于其参数.

有关我正在讨论的代码的更多信息,请访问http://www.albahari.com/nutshell/predicatebuilder.aspx

c# expression-trees

23
推荐指数
1
解决办法
8638
查看次数

将 access_token 存储在用户声明中以进行授权是否安全?

因此,我在设置 IdentityServer4 时遇到了承载身份验证问题。基本上,我无法调用我的 API 资源并收到 401 错误。当我使用 access_token 添加授权标头时。我能够从我的网络请求中获取数据。

using (var client = new HttpClient())
{
        client.DefaultRequestHeaders.Authorization = new 
           AuthenticationHeaderValue("Bearer", authToken);
        var content = await  
          client.GetStringAsync("http://localhost:5000/localapi");
}
Run Code Online (Sandbox Code Playgroud)

我获取 auth_token 的方法是将用户声明存储在由身份服务器客户端设置证明的 SecurityTokenValidated 回调中。

Notifications = new OpenIdConnectAuthenticationNotifications
{
    SecurityTokenValidated = notification =>
    {
        var identity = notification.AuthenticationTicket.Identity;
        identity.AddClaim(claim: new Claim(type: "auth_token", value: 
           notification.ProtocolMessage.AccessToken));
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这解决了我的授权问题,但我想确保我不会通过将我的 auth_token 存储在身份声明中来打开攻击向量。谁能告诉我这是否会带来安全问题。

我担心的原因是我能够使用 Postman 创建一个简单的请求,并手动将相同的 Bearer 授权令牌粘贴到请求中,然后发送它。响应给了我“安全”的 API 数据。这对我来说,如果有人拿到了 auth_token,他们就可以访问 API(或者 Postman 可能会绕过某些东西?)。

authorization claims-based-identity bearer-token openid-connect

6
推荐指数
1
解决办法
1109
查看次数

评估表达式<Func <TModel,Object >>中的参数结果

评估代表

我有一个表达式,我使用一个参数,我想在下面的DoSomething函数中使用它的结果.

public void DoSomething <TModel>(Expression<Func<TModel, String>> func){

}
Run Code Online (Sandbox Code Playgroud)

调用DoSomething方法

以下TModelNames属性中有一个名称列表,我想在DoSomething方法中访问它.我无法弄清楚如何做到这一点.

DoSomething(m => m.Names);
Run Code Online (Sandbox Code Playgroud)

试图编译没有成功

... 
func.Compile().Invoke([need m.Names]) in here. 
Run Code Online (Sandbox Code Playgroud)

我的现实代码看起来像这样

public static HelperResult TestFor<TModel>(
        ExtendedPageBaseClass<TModel> page,
    Expression<Func<TModel, object>> valueField,
    Expression<Func<TModel, object>> displayField,
    Expression<Func<TModel, ICollection>> list, 
        Object defaultValue = null, String changedEvent = null)   
{
    var idField = valueField.GetName();
    var label = displayField.GetName();
    var display = page.Html.NameFor(displayField).ToString();
    var data = list.Compile().Invoke(page.Html.ViewData.Model);
    return IsolatedSelectorFor(page, idField, display, label, data);
}
Run Code Online (Sandbox Code Playgroud)

c# linq asp.net-mvc lambda expression-trees

2
推荐指数
1
解决办法
3134
查看次数

如何使用UITypeEditor为Visual Studio创建简单的Automation Extender

在Visual Studio中,当您在解决方案资源管理器中选择项目或项目项时,有时您可能想要向属性窗口(按F4时弹出的窗口)添加自定义属性。另外,要填充这些属性的值,我需要添加一个按钮以弹出一个表单,以便我可以在设计时从用户那里收集信息。

什么是最简单的实现,这样我就可以开始了?如何使用UITypeEditAttribute创建一个用户界面来收集值?

ide extensibility visual-studio

2
推荐指数
1
解决办法
400
查看次数

当我没有更改任何内容时,为什么 TFS 显示我所有文件的挂起更改?

我是使用 TFS 源代码管理的新手。

我有一个从 SVN 移植过来的大项目。我已登记并了解所有项目的最新情况。但是,我今天打开了 Visual Studio,即使没有任何更改,所有项目项都在挂起的更改包含窗口中。

自上次以来,我没有接触或编辑过我的 TFS 文件的任何文件。

为了验证,我使用 Araxis Merge 进行了文件夹比较,可以看到没有发生实际更改。

为什么这些未更改的文件会出现在我的签入窗口中?

以下是 Visual Studio 与之前版本的差异示例: 在此处输入图片说明 我什么都看不见!

希望这显示了我的本地工作区

在此处输入图片说明

version-control tfs visual-studio tfvc

1
推荐指数
1
解决办法
798
查看次数