如何通过通用类作为一个参数,以非通用的类的构造
-
18-09-2019 - |
题
假设以下代码(请读我的问题在代码注释中的最后一类):
//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通用的。
- 使非通用的基类,既有使用它。
- 提供一个接口的使用,例如ISynchInfo,并具有一般类实现接口。
在这种情况下,我宁愿接口的办法,因为您可能想要同其他类型(单独的客户要求)的未来。
请ClientRequestInfo客户(K,V)实现与接口功能的接口ClientRequestInfo客户将SynchRequest需求。
不隶属于 StackOverflow