假设以下代码(请读我的问题在代码注释中的最后一类):

//This is my Generic Class
public class ClientRequestInfo<K, V>
{
    public string Id { get; set; }
    private Dictionary<K, V> parameters;

    public ClientRequestInfo()
    {
        parameters = new Dictionary<K, V>();
    }

    public void Add(K key, V value)
    {
        parameters.Add(key, value);
    }
 }

public class ProcessParameters()
{
    private void CreateRequestAlpha()
    {
        ClientRequestInfo<int, string> info = new ClientRequestInfo<int, string>();
        info.Add(1, "Hello");
        SynchRequest s = new SynchRequest(info);
        s.Execute();
    }
    private void CreateRequestBeta()
    {
        ClientRequestInfo<int, bool> info = new ClientRequestInfo<int, bool>();
        info.Add(1, true);
        SynchRequest s = new SynchRequest(info);
        s.Execute();
    }
}

public class SynchRequest
{
    //What type should I put here?
    //I could declare the class as SynchRequest<K, V> but I don't want
    //To make this class generic.
    private ClientRequestInfo<????,?????> info;
    private SynchRequest(ClientRequestInfo<?????,?????> requestInfo)
    {
        //Is this possible?
        this.info = requestInfo;
    }

    public void Execute()
    {}
}
有帮助吗?

解决方案

如果你不想做SynchRequestInfo通用的,你可以为ClientRequestInfo非泛型基类? -

public abstract class ClientRequestInfo
{
    public abstract void NonGenericMethod();
}

public class ClientRequestInfo<K, V> : ClientRequestInfo
{
    public override void NonGenericMethod()
    {
        // generic-specific implementation
    }
}

然后:

public class SynchRequest
{
    private ClientRequestInfo info;

    private SynchRequest(ClientRequestInfo requestInfo)
    {
        this.info = requestInfo;
    }

    public void Execute()
    {
        // ADDED: for example
        info.NonGenericMethod();
    }
}

其他提示

在类有,如果你想一般的成员变量是通用的。

private ClientRequestInfo<????,?????> info;

时的通用部件。

可以使用非通用基类或接口:

class ClientRequestInfo<K,Y> : IClientRequestInfo

但是,在你的榜样,ClientRequestInfo客户没有任何非通用成员,因此接口/基类是空的,必须被浇铸成正确的通用版本是有用的反正。

你有两个选择,如果要不让SynchRequestInfo通用的。

  1. 使非通用的基类,既有使用它。
  2. 提供一个接口的使用,例如ISynchInfo,并具有一般类实现接口。

在这种情况下,我宁愿接口的办法,因为您可能想要同其他类型(单独的客户要求)的未来。

请ClientRequestInfo客户(K,V)实现与接口功能的接口ClientRequestInfo客户将SynchRequest需求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top