无法在非泛型静态类

时间:2017-02-09 11:15:48

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

因此,如果问题是每个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);
    }
}

答案 1 :(得分:1)

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

您的generateA方法仍然可以是通用的(就像它已经存在一样),而且您似乎无法在其他地方使用T