无法在非泛型静态中声明扩展方法 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);
}
}
我正在尝试使用扩展为任何 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);
}
}