C# 这也不太理想。谢谢你:我正计划使用反射来调用派生类上的静态成员。我真的想要一种方法来确保他们一直在那里;因此,我的原始问题中的编译时检查条件。不过,我可以看出,我需要有点不同的想法。这只是将“每个具体类都应该公开一个静态方法”的问题推到“每个具体类都应该公

C# 这也不太理想。谢谢你:我正计划使用反射来调用派生类上的静态成员。我真的想要一种方法来确保他们一直在那里;因此,我的原始问题中的编译时检查条件。不过,我可以看出,我需要有点不同的想法。这只是将“每个具体类都应该公开一个静态方法”的问题推到“每个具体类都应该公,c#,methods,static,abstract,C#,Methods,Static,Abstract,这也不太理想。谢谢你:我正计划使用反射来调用派生类上的静态成员。我真的想要一种方法来确保他们一直在那里;因此,我的原始问题中的编译时检查条件。不过,我可以看出,我需要有点不同的想法。这只是将“每个具体类都应该公开一个静态方法”的问题推到“每个具体类都应该公开一个具有相关实例的静态字段或属性”上,同时增加了一个限制,即它是一个单例甚至是合理的。考虑到仍然有一个编译器无法验证的条件,并且仍然需要通过反射查找内容,我宁愿不需要singleton部分,而返回到方法的“未编译时检查”位。@JonSkeet


这也不太理想。谢谢你:我正计划使用反射来调用派生类上的静态成员。我真的想要一种方法来确保他们一直在那里;因此,我的原始问题中的编译时检查条件。不过,我可以看出,我需要有点不同的想法。这只是将“每个具体类都应该公开一个静态方法”的问题推到“每个具体类都应该公开一个具有相关实例的静态字段或属性”上,同时增加了一个限制,即它是一个单例甚至是合理的。考虑到仍然有一个编译器无法验证的条件,并且仍然需要通过反射查找内容,我宁愿不需要singleton部分,而返回到方法的“未编译时检查”位。@JonSkeet你是对的,我也喜欢你的反射+单元测试——我对我的建议也不完全满意。我仍然想知道Ed的问题是否也可以通过使用静态方法或单一实例,而不是使用C#的编译时特性,在不强制执行单个实例的情况下得到解决。例如,我的第二种选择不使用单例。然而,它需要无参数构造函数,这也不理想。
// fantasy code
abstract public class BaseClass
{
    static abstract public void RequiredStaticMethod();
}
abstract public class BaseClass
{
    abstract public void RequiredStaticMethod();
}

sealed class Subclass : BaseClass
{
    public static readonly Subclass Instance = new Subclass();

    public void RequiredStaticMethod() {}    
}
class Program
{
    public static void Main()
    {
        var classes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterface("IFoo") != null);
        foreach(var foo in classes.Select(c => Activator.CreateInstance(c)).Cast<IFoo>())
        {
            foo.RequiredNonStaticMethod();
        }
    }
}

public interface IFoo
{
    void RequiredNonStaticMethod();
}

public class FooImpl : IFoo
{
    public void RequiredNonStaticMethod()
    {
        Console.WriteLine("Foo");
    }
}