在静态 class 定义中获得 SA1401

Got SA1401 in static class definition

所以首先我有通用的 class 实现了一些东西。

public class MyGenericClass<T> where T : class
{
    ...
    public T SomeFunction(T t) {...}
    ...
}

然后我想要两个 "instance" 这个通用的 class (不同类型),可以在我的项目中随处使用,但不知道该怎么做。

使用全局可能是一个选项,但我想制作另一个包含不同通用 class.

的静态 class
public static class CosmosDBHelper
{
    public static MyGenericClass<T1> t1;
    public static MyGenericClass<T2> t2;
}

但是StyleCop会报SA1401错误"Field should be private"。我找到了以下解决方案,但它看起来很多余。

public static class CosmosDBHelper
{
    private static MyGenericClass<T1> t1;
    public static MyGenericClass<T1> T1 { get { return t1; } }
    private static MyGenericClass<T2> t2;
    public static MyGenericClass<T2> T2 { get { return t2; } }
}

有没有更好的方法?

谢谢,

这与在静态 class 中使用通用 class 无关。规则 SA1401 简单地指出 class 字段不应该是 public。

阅读文档,我们发现"a violation of this rule occurs whenever a field in a class is given non-private access. For maintainability reasons, properties should always be used as the mechanism for exposing fields outside of a class, and fields should always be declared with private access. This allows the internal implementation of the property to change over time without changing the interface of the class."

有两种解决方案:

  1. 将字段设为私有:
    private static MyGenericClass<T1> t1;
    private static MyGenericClass<T2> t2;
  2. 将字段更改为属性:
    public static MyGenericClass<T1> t1 { get; } // Add a set to make it writeable
    public static MyGenericClass<T2> t2 { get; }

或者,如果需要,将两者组合(其中私有字段是 public 属性 的支持字段,正如您在解决方案中所做的那样)。

此外,为了清楚起见,传递给 MyGenericClass 的类型必须在创建字段或基于它们的 属性 时定义。属性 t1t2 应该是特定的、不同的类型,并且应该这样声明:

public static MyGenericClass<SomeClass> MyCustomClassInstance { get; }
public static MyGenericClass<string> MyStringClassInstance { get; }