gpt4 book ai didi

c# - 如何为本身是泛型的泛型类型声明类型参数?

转载 作者:行者123 更新时间:2023-11-30 13:49:23 25 4
gpt4 key购买 nike

假设我想实现一个过期缓存,并且我想让它在底层存储容器上通用。所以我将允许用户告诉我的类(class)使用哪种容器类型。但是因为我要用私有(private)类型填充它,所以我需要他们告诉我通用类型。所以我正在尝试做这样的事情:

class MyCache<K, V, Container> : IDictionary<K, V>
where Container : // what goes here?
{
private class MyValue
{
public readonly V Value;
public readonly DateTime InsertionTime;
}

private IDictionary<K, MyValue> m_dict = new Container<K, MyValue>(); // a specialization of the generic container

// implement IDictionary<K, V>, checking for value expiration
public bool TryGetValue(K key, out V val)
{
MyValue myval;
if (m_dict.TryGetValue(key, out myval))
{
if (Expired(myval.InsertionTime))
{
m_dict.Remove(key);
}
else
{
val = myval.Value;
return true;
}
}

// not there or expired
val = default(V);
return false;
}
}

所以 Container 需要是一个通用类型,因为我想将它专门化为一个私有(private)类型。我想象这样使用它:

var cache = new MyCache<String, String, Dictionary>();

这会导致实现使用字典。

这可能吗?它的语法是什么?如果不可能,那么在容器上获得类型安全和这种级别的可组合性的最佳替代方案是什么?

最佳答案

这行不通,因为调用者无法创建 Dictionary — MyValue 是 private

但如果您将 MyValue public 设置为 public 就可以做到:

public class MyValue<V>
{
public readonly V Value;
public readonly DateTime InsertionTime;
}

您希望 Container 是一个 IDictionary<K, MyValue<V>>并希望能够创建新的 Container 实例。所以你需要以下 constraints在容器类型参数中:

class MyCache<K, V, Container> : IDictionary<K, V>
where Container : IDictionary<K, MyValue<V>>, new()
{
private IDictionary<K, MyValue<V>> m_dict = new Container();
}

请注意 IDictionary<K, V>接口(interface)不提供 TryGetValue 方法。

示例用法:

var cache = new MyCache<string, int, Dictionary<string, MyValue<int>>>();

关于c# - 如何为本身是泛型的泛型类型声明类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com