防止在派生具有带有字符串常量的结构的类时“通过派生类型访问类型的静态成员”
本文关键字:派生 类型 访问类型 静态成员 结构 字符串 常量 | 更新日期: 2023-09-27 18:30:15
我正在用C#包装ForgeRock REST API实现。该实现是分层的。在ForgeRock级别上有一个基础层,它针对他们的每个产品(如OpenAM,OpenDJ等)进行了扩展。
API 层的一部分是 http 参数名称的定义(通常是对值的限制),我已经用 KnownParameter
个类的层次结构解决了这个问题,每个类都有结构体定义结构中的参数,每个结构都有一个Name
和潜在的方法或嵌套的Values
结构来限制或转换值。
代码库通常仅限于一个产品(以及祖先层:ForgeRock)。
从这个角度来看,我想避免 ReSharper 生成的"通过派生类型访问类型的静态成员"警告。
一方面,拥有同名类确实有帮助(它们是同一件事,只是从不同的命名空间的角度来看,它可以编译和工作正常),另一方面:即使在将ForgeRock.KnownParameters
重命名为ForgeRock.KnownParametersBase
ReSharper 也不满意。我认为在这种受限的情况下,有这种命名是可以的
我怎样才能避免这种警告,同时仍然受益于 ,并且仍然受益于继承?
示例代码(也在线包含更多引用正确文档位的 URL)分为四部分。
Main
显示ReSharper警告的程序:
using System.Collections.Specialized;
using ForgeRock.OpenAM;
namespace AccessToAStaticMemberOfATypeViaADerivedType
{
class Program
{
static void Main()
{
new NameValueCollection
{
{KnownParameters.PrettyPrint.Name, KnownParameters.PrettyPrint.Values.True},
{KnownParameters.Action.Name, KnownParameters.Action.Values.Logout}
};
}
}
}
ForgeRock
具有基KnownParameters
类的命名空间:
namespace ForgeRock
{
public class KnownParameters
{
public struct PrettyPrint
{
public const string Name = "_prettyPrint";
public struct Values
{
public const string False = "false";
public const string True = "true";
}
}
}
}
ForgeRock.OpenAM
具有 KnownParameters
类后代的命名空间。
namespace ForgeRock.OpenAM
{
public class KnownParameters : ForgeRock.KnownParameters
{
public struct Action
{
public const string Name = "_action";
public struct Values
{
public const string Logout = "logout";
}
}
}
}
ForgeRock.OpenDJ
具有 KnownParameters
类后代的命名空间。
namespace ForgeRock.OpenDJ
{
public class KnownParameters : ForgeRock.KnownParameters
{
public struct QueryFilter
{
public const string Name = "_queryFilter";
}
}
}
我认为在这种受限的情况下,进行这种命名是可以的。
好吧,我个人不同意。当相同的名称在程序中意味着不同的东西时,通常对可读性不利 - 当这两个名称通过继承相关时,情况更糟(IMO)。但是,如果您确实想使用此方法,则有两种选择:
-
找到一种指定
ForgeRock.KnownParameters
何时要使用其成员的方法,例如new NameValueCollection { {ForgeRock.KnownParameters.PrettyPrint.Name, ForgeRock.KnownParameters.PrettyPrint.Values.True}, {KnownParameters.Action.Name, KnownParameters.Action.Values.Logout} };
或者,您可以使用
using
别名:using BaseKnownParameters = ForgeRock.KnownParameters; ... new NameValueCollection { {BaseKnownParameters.PrettyPrint.Name, BaseKnownParameters.PrettyPrint.Values.True}, {KnownParameters.Action.Name, KnownParameters.Action.Values.Logout} };
-
禁用 R# 警告,如果您满意通过
ForgeRock.OpenAM.KnownParameters
访问ForgeRock.KnownParameters
的成员,例如使用ASCIIEncoding.UTF8
顺便说一句,我建议使用静态类而不是结构体。目前,有人可以写道:
var x = new KnownParameters.PrettyPrint.Values();
。你想让它合法吗?(它不会使用静态类。您也可以考虑使用枚举。