在我的VS LIGHTSWITCH 2013门户网站应用程序中,我允许用户创建链接到其他内部应用程序的切片。当新的磁贴创建一个名为' TileTitle +"的角色时用户"'被建造。这样我就可以根据用户角色显示和隐藏切片。但是,当尝试在查询过滤器方法中过滤tile实体时,我得到一些关于无法使用IsInRole方法的错误。
经过一番挖掘后,我决定尝试表达树,这就是我想出的:
partial void TileLinks_Filter(ref Expression<Func<TileLink, bool>> filter)
{
ParameterExpression p = Expression.Parameter(typeof(TileLink), "e");
MemberExpression ti = Expression.Property(p, "Title");
MethodInfo m2 = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) });
Type t = this.Application.User.GetType();
MethodInfo m = t.GetMethod("IsInRole");
Expression filterExpression = Expression.IsTrue(Expression.Call(Expression.Call(m2, ti, Expression.Constant(" User")), m));
filter = Expression.Lambda<Func<TileLink, bool>>(filterExpression, p);
// e => this.Application.User.IsInRole(e.Title + " User");
// this is what I would like to do
}
然而,这不起作用,我留下了这个非常奇怪的错误信息。
Method 'Boolean IsInRole(System.String)' declared on type 'System.Security.Claims.ClaimsPrincipal' cannot be called with instance of type 'System.String'
请帮我根据动态生成的角色过滤我的数据!
答案 0 :(得分:0)
你在Expression.Call
的外部调用中反驳了你的论点。如果你稍微破坏了代码,你最终会得到这个:
var titlePlusUser = Expression.Call(m2, ti, Expression.Constant(" User"));
var isInRole = Expression.Call(titlePlusUser, m); // <<-- !!!
Expression filterExpression = Expression.IsTrue(isInRole);
这是指示它使用e.Title + "User"
作为对象实例来调用IsInRole
。
相反,您需要生成另一个知道如何获取this.Application.User
的表达式,并将该表达式作为第一个参数传递。
var isInRole = Expression.Call(applicationUser, m, titlePlusUser);