Return HashSet<T> 来自泛型函数中泛型类型的 HashSet
Return HashSet<T> from HashSet of generic type in generic function
我有一个 Dictionary<Type, HashSet<GenericType>>
用来保存我的数据,我正在尝试创建一个函数 returns 给定通用类型 T : GenericType
的那些 HashSet 之一].
基本上
Dictionary<Type, HashSet<GenericType>> data;
public HashSet<T> Get<T>() where T : GenericType
{
var tp = typeof(T);
//....check if its in the dictionary, fill if not....
return data[tp];
}
这当然是无效的。但是我很难弄清楚我应该做什么。
不过,我觉得返回 T
是最佳选择,因为您可以这样做:
Get<Derived>().Where(x => x.DerivedProperty == someValue)
但我唯一想到的是每次调用 Get
时创建一个新的HashSet<T>
,然后使用foreach-loop cast并添加字典中已经存在的 HashSet 中的每个项目,但这感觉很浪费吗?
另一个想法是跳过 HashSet 并使用另一个(协变?)集合。但由于这些集合将包含 大量 数据,也许这也不是最好的主意。
简而言之,我想知道解决这个问题的最佳方法是什么。
更新
这就是我得到的结构。包含 data
的类型是我的代码结构中的一种服务类型。它将通过反射在运行时加载和初始化。从那里我后来使用各种 ServiceFactory 来获得该服务。
public class foo : Service
{
public Dictionary<Type, HashSet<BaseClass>> data = new Dictionary<Type, HashSet<BaseClass>>();
public T Get<T>() where T : BaseClass
{
var tp = typeof(T);
if (!data.ContainsKey(tp))
{
data.Add(typeof(Derived), new HashSet<BaseClass>() { new Derived(), new Derived(), new Derived() });
}
return data[tp];//this wont compile.
}
}
public class Derived : BaseClass
{
public int ExampleVariable {get;set;}
}
public abstract class BaseClass
{
// some things in here.
public void DoCommonStuff()
{
}
}
class program
{
static void Main(string[] args)
{
var service = ServiceFactory.GetService<foo>();
var collection = service.Get<Derived>();
}
}
我只想更改字典的类型,然后在您的 Get
方法中进行转换。当然,一定要将您的字典设为私有 - 然后您可以确保 只有您的代码 (理想情况下只有 Get
方法)可以访问它:
// Any data[typeof(Foo)] value will be a HashSet<Foo>. Only
// the Get method should access this dictionary.
private readonly Dictionary<Type, object> data = new Dictionary<Type, object>();
public HashSet<T> Get<T>() where T : GenericType
{
var tp = typeof(T);
object value;
if (data.TryGetValue(tp, out value))
{
return (HashSet<T>) value;
}
var newSet = new HashSet<T>()
// Populate newSet here
data[tp] = newSet;
return newSet;
}
我在 blog post 中对一个密切相关的问题进行了更多讨论。
我有一个 Dictionary<Type, HashSet<GenericType>>
用来保存我的数据,我正在尝试创建一个函数 returns 给定通用类型 T : GenericType
的那些 HashSet 之一].
基本上
Dictionary<Type, HashSet<GenericType>> data;
public HashSet<T> Get<T>() where T : GenericType
{
var tp = typeof(T);
//....check if its in the dictionary, fill if not....
return data[tp];
}
这当然是无效的。但是我很难弄清楚我应该做什么。
不过,我觉得返回 T
是最佳选择,因为您可以这样做:
Get<Derived>().Where(x => x.DerivedProperty == someValue)
但我唯一想到的是每次调用 Get
时创建一个新的HashSet<T>
,然后使用foreach-loop cast并添加字典中已经存在的 HashSet 中的每个项目,但这感觉很浪费吗?
另一个想法是跳过 HashSet 并使用另一个(协变?)集合。但由于这些集合将包含 大量 数据,也许这也不是最好的主意。
简而言之,我想知道解决这个问题的最佳方法是什么。
更新
这就是我得到的结构。包含 data
的类型是我的代码结构中的一种服务类型。它将通过反射在运行时加载和初始化。从那里我后来使用各种 ServiceFactory 来获得该服务。
public class foo : Service
{
public Dictionary<Type, HashSet<BaseClass>> data = new Dictionary<Type, HashSet<BaseClass>>();
public T Get<T>() where T : BaseClass
{
var tp = typeof(T);
if (!data.ContainsKey(tp))
{
data.Add(typeof(Derived), new HashSet<BaseClass>() { new Derived(), new Derived(), new Derived() });
}
return data[tp];//this wont compile.
}
}
public class Derived : BaseClass
{
public int ExampleVariable {get;set;}
}
public abstract class BaseClass
{
// some things in here.
public void DoCommonStuff()
{
}
}
class program
{
static void Main(string[] args)
{
var service = ServiceFactory.GetService<foo>();
var collection = service.Get<Derived>();
}
}
我只想更改字典的类型,然后在您的 Get
方法中进行转换。当然,一定要将您的字典设为私有 - 然后您可以确保 只有您的代码 (理想情况下只有 Get
方法)可以访问它:
// Any data[typeof(Foo)] value will be a HashSet<Foo>. Only
// the Get method should access this dictionary.
private readonly Dictionary<Type, object> data = new Dictionary<Type, object>();
public HashSet<T> Get<T>() where T : GenericType
{
var tp = typeof(T);
object value;
if (data.TryGetValue(tp, out value))
{
return (HashSet<T>) value;
}
var newSet = new HashSet<T>()
// Populate newSet here
data[tp] = newSet;
return newSet;
}
我在 blog post 中对一个密切相关的问题进行了更多讨论。