在两个静态类之间共享公共功能

本文关键字:共享 之间 功能 静态类 两个 | 更新日期: 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方法在这两个类之外没有任何意义。

要求:

  1. 我不能把它们组合成一个类,我需要它们分开,一个是泛型,另一个不是。

  2. 类不需要严格地是静态的,但它们不应该是可实例化的或可继承的。

  3. 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>();
    }
}