用泛型重构

Spo*_*ook 5 c# generics

我们假设我们有以下类:

class ViewModelA
{
    private ProxyA proxy;

    public ViewModelA(DataA data)
    {
        proxy = new ProxyA(data);
    }

    public void DoSth()
    {
        proxy.DoSth();
    }

    public ProxyA Proxy
    {
        get
        {
            return proxy;
        }
    }
}

class ViewModelB
{
    private ProxyB proxy;

    public ViewModelB(DataB data)
    {
        proxy = new ProxyB(data);
    }

    public void DoSth()
    {
        proxy.DoSth();
    }

    public ProxyB Proxy
    {
        get
        {
            return proxy;
        }
    }
}

...
Run Code Online (Sandbox Code Playgroud)

所有这些类实际上都要长得多,但在相同程度上也相似.

是否有(好的)方法将它们全部转换为一个泛型类?核心问题是这条线:

proxy = new ProxyA(data);
Run Code Online (Sandbox Code Playgroud)

因为C#不允许在泛型类专业化(就其而言T)上调用参数化ctors .

nvo*_*igt 1

如果您知道类型(并且您会使用泛型),则可以调用Activator.CreateInstance使用您想要的任何构造函数创建该类型的实例。

proxy = Activator.CreateInstance(typeof(TProxy), new[]{data});
Run Code Online (Sandbox Code Playgroud)

虽然这将解决您的直接问题,但您也可以考虑一种ViewModelA不知道DataA而是通过ProxyA. 这将解决你所有的问题,无需花哨的思考。