1

我需要在两个静态类之间共享一些通用功能:

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可以属于任何一类,没关系。

4

4 回答 4

1

此解决方法不满足所有 3 个要求(这是不可能的 imo),但它弥补了我想要的相同功能。

正如 Marc 在评论中建议的那样,我最终使用了一个类。但是后来我将泛型类嵌套在非泛型类中以执行泛型功能。

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

所以现在,即使调用的方式与我最初在问题中想要的方式略有不同,但在功能上两者是相等的。

于 2013-05-05T01:46:35.993 回答
1

首先我认为你不能满足这 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);
    }
}
于 2013-05-06T14:01:54.477 回答
-1

如果你可以使用单例模式,你可以有 2 个类,泛型类继承自标准类。您也可以保留静态方法,如下所示:

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>();
    }
}
于 2013-05-06T02:41:29.993 回答
-1

将这些类声明为密封的——这样它们就不能被继承。

如果您将权限从私有更改为受保护,那么您的应用程序中的任何内容都可以看到该方法,但对于尝试使用您的方法的另一个应用程序将不可见。

希望这可以帮助 !

于 2013-05-04T14:15:12.050 回答