假设以下代码(请在最后一节的代码注释中阅读我的问题):
//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()
{}
}
答案 0 :(得分:7)
如果您不想使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();
}
}
答案 1 :(得分:2)
如果你想要通用成员变量,那么这个类必须是通用的。
private ClientRequestInfo<????,?????> info;
是通用会员。
您可以使用非通用基类或接口:
class ClientRequestInfo<K,Y> : IClientRequestInfo
但是在您的示例中,ClientRequestInfo没有任何非泛型成员,因此接口/基类将为空,并且必须转换为正确的通用版本才能使用。
答案 2 :(得分:1)
如果您不想使SynchRequestInfo通用,您有两个选择。
在这种情况下,我更喜欢接口方法,因为您可能希望将来同步其他类型(与客户端请求分开)。
答案 3 :(得分:1)
使ClientRequestInfo(K,V)使用SynchRequest需要的接口函数实现ClientRequestInfo接口。