C#重构:除了使用不同的接口外,你将如何重构2个相同的方法

Roo*_*ian 2 c# refactoring

必须拥有2个不同的接口.

你会如何重构这个?

我应该重构这个代码吗?

private void CreateInstanceForProviderA()
{
    a = FactorySingleton.Instance.CreateInstanceA("A");

    if (a == null)
    {
        ShowProviderNotInstanciatedMessage();
        return;
    }

    a.Owner = Handle.ToInt32();
    lbl_Text.Text = a.Version();
}

private void CreateInstanceForProviderB()
{
    b = FactorySingleton.Instance.CreateInstanceB("B");

    if (b == null)
    {
        ShowProviderNotInstanciatedMessage();
        return;
    }

    b.Owner = Handle.ToInt32();
    lbl_Text.Text = b.Version();
}
Run Code Online (Sandbox Code Playgroud)

如果有一个通用接口,我可以写:

private void CreateInstanceForProvider(string provider)
{

    p = FactorySingleton.Instance.CreateInstanceB(provider);
    // p is shared over the whole class
    if (p == null)
    {
        ShowProviderNotInstanciatedMessage();
        return;
    }

    var tmpProvider = p as ICommonProvider;

    tmpProvider .Owner = Handle.ToInt32();
    lbl_Text.Text = tmpProvider .Version();
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*ran 5

嗯,要做的第一件事就是向作者大吼大叫FactorySingleton修复已经该死的代码,以便ClassA和ClassB为他们的公共字段有一个共同的接口.

在此期间,你几乎坚持使用反射,这将是丑陋的,并不值得它只是一点点.


Ben*_*igt 5

您使用的是哪个版本的C#?

在C#4(Visual Studio 2010)中,新dynamic关键字可以帮助在这种情况下共享代码.如果这是一个性能关键的代码部分,我不会使用,但如果这只是运行了几次,那么继续.