c# – 在这个.NET代码中遇到Generics的问题
发布时间:2020-12-16 01:38:08 所属栏目:百科 来源:网络整理
导读:我正在尝试制作混合类型的集合.我知道一开始的类型..但我似乎无法弄清楚制作集合的语法等. 例如. ....// I leave the typo there,for embarrassment :(Initialize(new []{ typeof(Cat),typeof(Dog),typeof(JohnSkeet) }); ...public Foo Initialize(IEnumera
|
我正在尝试制作混合类型的集合.我知道一开始的类型..但我似乎无法弄清楚制作集合的语法等.
例如. ....
// I leave the typo there,for embarrassment :(
Initialize(new []{ typeof(Cat),typeof(Dog),typeof(JohnSkeet) });
...
public Foo Initialize(IEnumerable<Type> types)
{
// for each type,set up the inmemory storage.
foreach(var type in types)
{
// ????
// Create an empty list,which will only contain this 'type'
// I'm guessing,an IDictionary<type,ICollection<type>>().. thingy ?
}
}
public ICollection<Type> SomeTypeData(Type type)
{
// Return the collection,for this type.
}
这鬃毛有意义吗?这可能吗? 解决方法
在我看来,你正在尝试创建某种实例存储库;存储给定类型的实例列表的类.
这是一个示例实现.我已经包含了SomeTypeData方法的泛型和非泛型版本: public class InstanceRepository
{
private IDictionary<Type,ICollection> _Instances = new Dictionary<Type,ICollection>();
public ICollection SomeTypeData(Type type)
{
ICollection instanceList;
if (!_Instances.TryGetValue(type,out instanceList))
{
// this type does not exist in our dictionary,so let's create a new empty list
// we could do this:
//instanceList = new List<object>();
// but let's use reflection to make a more type-specific List<T> instance:
instanceList = (ICollection)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
// now add it to the dictionary
_Instances.Add(type,instanceList);
}
// Return the collection,for this type.
return instanceList;
}
public IList<T> SomeTypeData<T>()
{
Type type = typeof(T);
ICollection instanceList;
if (!_Instances.TryGetValue(typeof(T),out instanceList))
{
instanceList = new List<T>();
_Instances.Add(type,instanceList);
}
// here we are assuming that all of the lists in our dictionary implement IList<T>.
// This is a pretty safe assumption,since the dictionary is private and we know that
// this class always creates List<T> objects to put into the dictionary.
return (IList<T>)instanceList;
}
}
以下是一个用法示例: 通用: InstanceRepository repository = new InstanceRepository();
var listOfCats = repository.SomeTypeData<Cat>();
listOfCats.Add(new Cat());
Cat firstCat = listOfCats[0];
Console.WriteLine(listOfCats.GetType().FullName);
非通用: InstanceRepository repository = new InstanceRepository();
var listOfCats = (IList<Cat>)repository.SomeTypeData(typeof(Cat));
listOfCats.Add(new Cat());
Cat firstCat = listOfCats[0];
Console.WriteLine(listOfCats.GetType().FullName);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
