在两个静态类之间共享公共功能
本文关键字:共享 之间 功能 静态类 两个 | 更新日期: 2023-09-27 18:12:11
我需要在两个静态类之间共享一些通用功能:
public static class Class
{
public static void ClassMethod()
{
SharedMethod<object>();
}
//ideally a private method
internal static void SharedMethod<T>()
{
}
}
public static class GenericClass<T>
{
public static void GenericClassMethod()
{
SharedMethod<T>();
}
}
这里有更好的设计吗?internal
是我最后的选择,但实际上SharedMethod
方法在这两个类之外没有任何意义。
要求:
我不能把它们组合成一个类,我需要它们分开,一个是泛型,另一个不是。
类不需要严格地是静态的,但它们不应该是可实例化的或可继承的。
SharedMethod
可以属于任何一类,这并不重要。
此解决方法不能满足所有3个要求(这在imo中是不可能的(,但它弥补了我想要的相同功能。
正如马克在评论中所建议的那样,我最终使用了一个单独的类。但后来我让泛型类嵌套在非泛型类中,以充当泛型功能。
public static class Class
{
public static void ClassMethod()
{
SharedMethod<object>();
}
static void SharedMethod<T>()
{
//----
}
public static void GenericClassMethod<T>()
{
return GenericClass<T>.SharedMethod();
}
static class GenericClass<T>
{
static void SharedMethod()
{
//available here since private members of outer class is visible to nested class
SharedMethod<T>();
}
}
}
所以现在,尽管这个调用的方式与我最初在问题中想要的方式没有什么不同,但在功能上两者是平等的。
首先我认为你不能满足这3条规则,但后来我考虑了反思,我想出了一些有效的方法,但除非你真的没有任何其他方法来完成你需要的东西,否则不应该使用
我不建议使用它,但为了好玩,我会发布代码:
public static class ClassA
{
private static void sharedMethod<T>() { }
public static void ClassMethod()
{
sharedMethod<object>();
}
}
public static class GenericClass<T>
{
static MethodInfo sharedMethodInfo;
static GenericClass()
{
MethodInfo mi = typeof(ClassA).GetMethod("sharedMethod", BindingFlags.NonPublic | BindingFlags.Static);
sharedMethodInfo = mi.MakeGenericMethod(new Type[] { typeof(T) });
}
public static void GenericClassMethod()
{
sharedMethodInfo.Invoke(null, null);
}
}
将类声明为密封的,这样它们就不可继承。
如果您将权限从private更改为protected,那么应用程序中的任何内容都可以看到该方法,但对于尝试使用您的方法的其他应用程序来说都是不可见的。
希望这能有所帮助!
如果可以使用singleton模式,则可以有两个类,其中泛型类继承自标准类。你也可以保持你的静态方法,下面是它的样子:
internal class ClassA
{
private static ClassA _instance;
private static ClassA Instance
{
get
{
if (_instance == null) _instance = new ClassA();
return _instance;
}
}
protected void sharedMethod<T>() { }
public static void ClassMethod()
{
Instance.sharedMethod<object>();
}
}
public sealed class GenericClass<T> : ClassA
{
private static GenericClass<T> _instance;
private static GenericClass<T> Instance
{
get
{
if (_instance == null) _instance = new GenericClass<T>();
return _instance;
}
}
public static void GenericClassMethod()
{
Instance.sharedMethod<T>();
}
}