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%理解他们正在编写的代码。添加隐藏功能无助于此。