C# 访问接口上的动态属性

5

我正在尝试使用FluentSecurity库来进行asp.net mvc开发。该库公开的接口之一是ISecurityContext,如下所示:

public interface ISecurityContext
{
    dynamic Data { get; }
    bool CurrenUserAuthenticated();
    IEnumerable<object> CurrenUserRoles();
}

当我尝试访问“Data”属性(如下所示)时,它不可用。虽然似乎可以访问另外两种方法。

public class ExperimentalPolicy : ISecurityPolicy
{
    public PolicyResult Enforce(ISecurityContext context)
    {
        dynamic data = context.Data; // Data property is not accessible.
    }
}

我错过了什么?谢谢。


实际的异常是什么,我认为这个问题应该与ISecurityContext的实际实现有关,而不是调用数据本身返回的内容,因为无论返回类型是否为动态类型,Data本身都是一个静态属性。 - jbtule
@jbtule,请看一下我对Hogan的回答的评论。 - user1599610
1
你的评论中没有异常。但是它提到了在使用源代码时工作,而不是dll。这是编译器错误吗?你没有使用nuget中的1.4 dll吗?因为在2.0之前,ISecurityContext上没有Data属性。https://github.com/kristofferahl/FluentSecurity/blob/a7b48011448ec366c664b83a4fb0fb0db44434d4/FluentSecurity/ISecurityContext.cs - jbtule
@jbtule 谢谢。我下载的源代码是2.0版本,而我使用的是1.4参考文档。感觉有点傻 :) 无论如何...如果您能把您的评论写成答案,我就可以将其标记为一个答案。 - user1599610
2个回答

2
< p >在< code > ISecurityContext 上,< code > Data 属性直到版本 2.0 才引入。 如果不包括预发行版,则nuget默认安装的版本为 1.4 。 此版本没有该属性。 确保您正在使用正确的版本!< /p >

0
以下内容如预期运行,我是否与您不同?
void Main()
{
  ATest t = new ATest();
  Experiment z = new Experiment();

  z.TestTest(t);
}

public class ATest : ITest
{
  public dynamic Data {get; set;}

  public ATest()
  {
     Data = new { Test = "This is a string" };
  }
}

// Define other methods and classes here
public interface ITest
{
  dynamic Data { get; }
}

public class Experiment
{
    public int TestTest(ITest context)
    {
       dynamic data = context.Data; 

       Console.WriteLine(data.Test);

       return 0;
    }
}

@Abhinav - 是的,你说得对,我进行了一些测试并发布了一些不基于猜测的内容(所以你现在的评论可能看起来有些奇怪)。 - Hogan
@Hogan,你的代码很好,但问题在于接口是由外部库提供的。 - Omar
@Fuex,我不知道为什么那会有影响。 - Hogan
@Hogan 首先我也像你一样想,但是阅读了 MSDN 的文档后似乎这很重要。 - Omar
@Hogan 令人惊讶的是,这确实很重要。我很困惑为什么会这样。如果我在FluentSecurity的源代码中编写相同的类,它可以正常工作。但是当我在asp.net mvc项目中引用FluentSecurity.dll时,同样的事情却不起作用。我很困惑为什么会有这种限制。 - user1599610
@Hogan,你不应该使用dynamic返回匿名类型。我知道这是测试代码,但由于匿名类型标记为internal,当跨组件边界时它是不可访问的。这可能是与用户1599610遇到的问题相同,但从上下文中很难确定。 - jbtule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接