【问题标题】:Cannot declare an extension method in a non-generic static class无法在非泛型静态类中声明扩展方法
【发布时间】:2017-06-27 09:01:41
【问题描述】:

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

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

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

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 设为通用的原因。

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

【问题讨论】:

  • Extension_S 上的参数 T 没有在任何地方使用,所以看起来你可以删除它。
  • 你的标题与你的类的通用性不匹配。
  • 请尝试阅读错误信息。我相信编译器的确切错误消息是“扩展方法必须在非泛型静态类中定义”。如果您想问为什么存在此限制,请询问。
  • 请创建一个可以直接编译的minimal reproducible example。也总是发布确切的错误消息。

标签: c# generics extension-methods static-methods static-variables


【解决方案1】:

在尝试理解您的问题后,我想我明白了,首先错误是错误的,编译器上的错误抱怨因为必须在非泛型静态类中创建扩展,并且您发布的文本似乎说相反。

因此,如果问题是每个 T 必须有不同的 X,则需要在创建和重用后存储该类,然后可以将非泛型类与字典一起使用:

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);
    }
}

【讨论】:

    【解决方案2】:
    //public static class Extensions_S<T> { ...}
      public static class Extensions_S { ... }
    

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

    【讨论】:

    • OP 显然已经尝试过这个:“Extensions_S is not allowed”。无论如何,这个答案对社区根本没有用。也许它回答了 OP 的问题(它似乎没有),但没有任何进一步的 cmets 它不是很有意义。
    • @HimBromBeere - “Extensions_S is not allowed”毫无意义。
    • @HimBromBeere:这是我已修复的标记问题。在源代码中,他们编写了Extensions_S&lt;T&gt;,但没有代码标记,&lt;T&gt; 正在丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多