我正在尝试使用扩展名为任何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
通用的原因。
我的问题是:有解决方法吗?
答案 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
。