C# 如何解决';授权';是';System.Web.Mvc.Authorizeattribute';和';ProjectDefaultNamespace';?

C# 如何解决';授权';是';System.Web.Mvc.Authorizeattribute';和';ProjectDefaultNamespace';?,c#,asp.net-mvc,asp.net-identity,C#,Asp.net Mvc,Asp.net Identity,为了回答以下问题,我在我的项目默认名称空间中创建了一个AuthorizeAttribute类。因此编译器将自动选择它,而不是MVC的标准。但它选择了System.Web.Mvc.Authorizeattribute 如果我包括我的项目名称空间,这是使用TestIdentitySample的然后显示以下错误 'Authorize' is an ambiguous reference between 'System.Web.Mvc.Authorizeattribute' and 'Project

为了回答以下问题,我在我的项目默认名称空间中创建了一个
AuthorizeAttribute
类。因此编译器将自动选择它,而不是MVC的标准。但它选择了
System.Web.Mvc.Authorizeattribute

如果我包括我的项目名称空间,这是使用TestIdentitySample的
然后显示以下错误

  'Authorize' is an ambiguous reference between 'System.Web.Mvc.Authorizeattribute' and 'ProjectDefaultNamespace'
  • 请注意,我不想使用完全限定名称命名空间别名其他自定义属性名称
我的属性类


如果可能的话,我只是希望编译器能够自动地选择它,而不是MVC的标准版本。提前感谢您的帮助。

您应该重新考虑使用相同名称创建自己属性的方法。这是有问题的,原因有二:

  • 代码的读者可能会认为它是内置属性,而不是您自己的属性。他们可能会对代码的功能产生误解。这对于
    authorized属性
    尤其重要,因为安全性通常是web应用程序中的一个关键问题
  • 您可能会遇到命名冲突。这就是这里发生的事情
  • 您可以通过不同的方式解决问题:

    重命名您的属性

    一个好的解决方案——也是我推荐的解决方案——就是简单地重命名您的自定义属性,这样就可以清楚地知道它是您的,并且命名冲突得到解决

    明确指定名称空间

    如果要保持属性的相同名称,可以通过显式指定自己的命名空间来解决命名冲突:

    [ProjectDefaultNamespace.Authorize]
    
    使用名称空间别名

    您还可以使用
    列表在
    中指定命名空间别名:

    using MyAuthorizeAttribute = ProjectDefaultNamespace.AuthorizeAttribute;
    
    然后像这样应用它:

    [MyAuthorizeAttribute]
    

    但话说回来,为什么不给它起一个你自己的名字呢?它在代码中看起来是一样的,只是没有别名的额外复杂性。

    您应该重新考虑使用相同名称创建自己属性的方法。这是有问题的,原因有二:

  • 代码的读者可能会认为它是内置属性,而不是您自己的属性。他们可能会对代码的功能产生误解。这对于
    authorized属性
    尤其重要,因为安全性通常是web应用程序中的一个关键问题
  • 您可能会遇到命名冲突。这就是这里发生的事情
  • 您可以通过不同的方式解决问题:

    重命名您的属性

    一个好的解决方案——也是我推荐的解决方案——就是简单地重命名您的自定义属性,这样就可以清楚地知道它是您的,并且命名冲突得到解决

    明确指定名称空间

    如果要保持属性的相同名称,可以通过显式指定自己的命名空间来解决命名冲突:

    [ProjectDefaultNamespace.Authorize]
    
    使用名称空间别名

    您还可以使用
    列表在
    中指定命名空间别名:

    using MyAuthorizeAttribute = ProjectDefaultNamespace.AuthorizeAttribute;
    
    然后像这样应用它:

    [MyAuthorizeAttribute]
    

    但话说回来,为什么不给它起一个你自己的名字呢?它在代码中看起来是一样的,只是没有别名的额外复杂性。

    只要代码中根本没有对
    System.Web.Mvc
    的引用(但这不太可能,因为您希望在
    控制器上使用它),所以只需更改属性的名称,或者使用完全限定名称。明白你的意思了。“请注意,我不想使用完全限定名称、命名空间别名或其他自定义属性名称。”这些是你的选项。它们有什么问题?只要代码中没有对
    System.Web.Mvc
    的引用就行了(但这不太可能,因为您希望在
    控制器上使用它),所以只需更改属性的名称,或者使用完全限定的名称。明白了。“请注意,我不想使用完全限定名称或命名空间别名或其他自定义属性名称。”这些是您的选项。它们有什么问题吗?@Safe,感谢您的ans,这很有意义。我已经看过这些解决方案。我只是想避免使用它们,以便其他使用“[Authorize]的程序员(Roles=“foo”)]没有考虑新的Custome Authorize名称或新的附加名称空间。@ramzanali:如果您创建自己的属性,开发人员将不得不考虑这一点。因为没有办法解决这一问题,所以用您自己的名称来澄清这一点反而有助于他们解决这一问题。更糟糕的是,通过创建隐藏的功能让开发人员蒙在鼓里关系。他们必须100%理解他们正在编写的代码。添加隐藏功能无助于此。@安全,感谢您的ans,这很有意义。我已经看过这些解决方案了。我只是想避免使用它们,以便其他使用“[Authorize(Roles=“foo”)”的程序员没有考虑新的Custome Authorize名称或新的附加名称空间。@ramzanali:如果您创建自己的属性,开发人员将不得不考虑这一点。因为没有办法解决这一问题,所以用您自己的名称来澄清这一点反而有助于他们解决这一问题。更糟糕的是,通过创建隐藏的功能让开发人员蒙在鼓里关系。他们必须100%理解他们正在编写的代码。添加隐藏功能无助于此。