如何最好地访问可以运行相同方法的不同实现的静态方法?

时间:2017-12-20 11:03:40

标签: c#

我正在寻找一种干净的方法来运行可能在静态方法中具有不同实现的方法。

这个要求的原因是我想访问一个总是调用方法B的静态方法A.然而,方法B的实现可能会有所不同。

代码的简单示例如下.....

google-cloud

显然public class PageFactory { public static void InitializeElements() { new PageFactory().Initialize(); } public virtual void Initialize() { Console.WriteLine("Page factory initialize"); } } public class SepaPageFactory : PageFactory { public override void Initialize() { Console.WriteLine("SEPA Factory initialize"); } } class Program { static void Main(string[] args) { // "Page factory initialize" PageFactory.InitializeElements(); // I would like to see "SEPA Factory initialize here" SepaPageFactory.InitializeElements(); Console.ReadLine(); } } 没有返回我想要的结果。

这是我考虑的第一个选项

SepaPageFactory.InitializeElements();

然后做......

public static void InitializeElements(PageFactory factory)
{
    factory.Initialize();
}

我也可以......

PageFactory.InitializeElements(new PageFactory());
PageFactory.InitializeElements(new SepaPageFactory());

和...

public static void InitializeElements<T>() where T : PageFactory, new()
{
    new T().Initialize();
}

有没有更好的方法来实现这一目标?

我对任何可以解决此问题的设计建议持开放态度。

修改

我将尝试描述实际的用例.....

这是测试自动化框架的一部分,其中网页上的元素由类中的字段表示。这些&#39;页&#39;类可以有超过50个元素,都需要实例化。因为它们都具有相同的构造函数参数,所以快速而干净的方法(IMO)是反射。

真实的&#39; initialize方法将用于反映和实例化这些页面上的某些字段。

使用我上面的泛型实现看起来像......

PageFactory.InitializeElements<PageFactory>();
PageFactory.InitializeElements<SepaPageFactory>();
在此上下文中,

public static void InitializeElements<U,T>(IWebDriver driver, T page) where U : PageFactory, new() { new U().Initialize(driver, page); } public virtual void Initialize<T>(IWebDriver driver, T page) { var pageType = typeof(T); const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; foreach (var field in pageType.GetFields(flags)) { var findsByAttribute = (FindsByAttribute)field.GetCustomAttribute(typeof(FindsByAttribute)); var frameAttribute = (FrameLocatorAttribute)field.GetCustomAttribute(typeof(FrameLocatorAttribute)); var fieldType = field.FieldType; if (fieldType.IsSubclassOf(typeof(Control)) || fieldType == typeof(Control)) { field.SetValue(page, frameAttribute != null ? InitializeControls<Control>(field, driver, findsByAttribute, frameAttribute) : InitializeControls<Control>(field, driver, findsByAttribute)); } } } 是提供Initialize方法实现的类。

大多数情况下,这种实现是足够的,但有时会对实例化哪些字段类型有不同的限制,因此需要虚拟/覆盖。

这将在我希望初始化所有字段的页面的构造函数中使用,例如......

U

无论使用哪种Initialize实现,我都希望保持一致。

1 个答案:

答案 0 :(得分:0)

嗯,这不应该是最好的方法,但你也可以这样做:

    public class Foo
    {
        public static void DoWork(int a)
        {
        }
    }

    public class Doh : Foo
    {
        public **new** static void DoWork(int a)
        {
        }
    }

这应该“覆盖”该方法,但也许最好考虑不同的方法:)