无法在非泛型静态中声明扩展方法 class

Cannot declare an extension method in a non-generic static class

我正在尝试使用扩展为任何 C# 对象实现扩展。

我的方法将使用我无法修改的对象 X,并将该对象的类型作为参数。问题是我想保留这个对象;我不希望它被垃圾收集。

这是我当前的代码,但我无法在非泛型静态 class 中声明扩展方法(Extensions_S<T> 是不允许的。编译器的错误消息是“extension方法必须在非泛型静态 class").

中定义
namespace Lib
{
    public static class Extensions_S<T>
    {
        private static X generateA_X = null;
        public static A generateA<T>(this T value)
        {
            if (generateA_X == null)
                generateA_X = new X(typeof(T));

            return generateA_X.from(value);
        }
    }
}

generateA_X 实际上相当于静态方法变量。我希望每个类型 T 都有一个 不同的实例,它调用此扩展方法。 这就是为什么我要使 Extensions_S 通用。

我的问题是:有解决方法吗?

//public static class Extensions_S<T> { ...}
  public static class Extensions_S { ... }

您的 generateA 方法仍然可以是通用的(就像它已经是那样)并且您似乎没有在其他任何地方使用 T

在试图理解你的问题之后我想我理解了,首先错误是错误的,编译器的错误抱怨是因为必须在 non-generic 静态 class 中创建扩展,并且您发布的文字似乎与此相反。

所以,如果问题是每个 T 必须有不同的 X,您需要存储 class 一旦创建并重复使用,然后您可以使用 non-generic class字典:

public static class Extensions_S
{
    static Dictionary<Type, X> generators = new Dictionary<Type, X>();

    public static A generateA<T>(this T value)
    {
        X generator;

        if(!generators.TryGetValue(typeof(T), out generator)
        {
            generator = new X(typeof(T));
            generators.Add(typeof(T), generator);
        }

        return generator.from(value);
    }
}