防止在派生具有带有字符串常量的结构的类时“通过派生类型访问类型的静态成员”

本文关键字:派生 类型 访问类型 静态成员 结构 字符串 常量 | 更新日期: 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();

你想让它合法吗?(它不会使用静态类。您也可以考虑使用枚举。