C# 使用函数传递的自定义类型创建字典C
我想创建一个字典,其中TKey作为字符串,TValue来自编译时未知的类型 比如说,我有一个函数C# 使用函数传递的自定义类型创建字典C,c#,dictionary,C#,Dictionary,我想创建一个字典,其中TKey作为字符串,TValue来自编译时未知的类型 比如说,我有一个函数 createDict(Type type) { Dictionary<string, {here's the type from the func. argument}> dict = new Dictionary.. } 这是可能的还是我缺少了一些非常基本的东西?使方法通用: public void CreateDict<T>() { Dicti
createDict(Type type)
{
Dictionary<string, {here's the type from the func. argument}> dict = new Dictionary..
}
这是可能的还是我缺少了一些非常基本的东西?使方法通用:
public void CreateDict<T>()
{
Dictionary<string,T> dict = new Dictionary<string,T>();
}
尽管您可能希望返回类型也是Dictionary,并向泛型类型参数添加约束
你可以称之为:
CreateDict<MyCustomType>();
以上假设类型可以在编译时传入。您可以通过一些反射来完成:
Type dict = typeof (Dictionary<,>);
Type[] parameters = {typeof (string), type};
Type parametrizedDict = dict.MakeGenericType(parameters);
object result = Activator.CreateInstance(parametrizedDict);
所有实例和类都是对象,所以为什么不使用Dictionary,并使用MVC、Session或Cache中处理ViewData的相同方式进行强制转换,所有这些实例和类都需要强制转换。如果将type作为参数传递,则可以进行强制转换:
var dictionaryType = typeof(Dictionary<,>).MakeGenericType(typeof(string),type);
var dictionary = (IDictionary)Activator.CreateInstance(dictionaryType);
由于您对插入到此词典的内容的正确性承担全部责任,因此使用此类词典将更加困难。如果在编译时已知类型,请使用泛型:
void Main()
{
var dict = CreateDict<int>();
dict["key"] = 10;
}
Dictionary<string, T> CreateDict<T>()
{
return new Dictionary<string, T>();
}
如果不是,则重构以使用基类型或接口,例如:
var dic = new Dictionary<string, IMyType>();
其中IMyType公开了希望保留在字典中的类型的常见特征
只有在万不得已的情况下,我才会考虑使用反射。@Oded编译时不知道OP的状态,但是如果没有关于如何确定类型的任何细节,没有人知道反射或泛型是否合适。@Oded,是吗?我肯定遗漏了一些东西,但博文作者指出了编译时不知道的类型。在代码中,您应该使用“type”而不是“typeoftype”,不是吗?i、 e.只需使用传递给OP的createDict方法的'type'参数仅需一个注释-这假设从调用方的角度来看,类型在编译时已知。仅需一个注释-这假设从调用方的角度来看,类型在编译时已知。这是正确的。如果类型在编译时未知,我想应该是反射。通常情况下,虽然这是一个标志,但设计有问题。我编辑了我的帖子来反映这一点,你的类型是如何确定的?人们似乎对泛型解决方案投了更高的票,而不考虑您关于不知道编译时的类型的声明。没有反射的封闭泛型需要编译时的类型。如果您能告诉我们如何确定类型,那么答案可以更好地针对您的问题进行定制。在我看来,类型是通过传递给的类型参数确定的createDict@MatthewWatson很明显,但我试图确定它是否真的需要,而不是在编译时知道类型。在字典甚至哈希表面前,你不知道类型的普通字典对我来说似乎很奇怪。是的,它有点奇怪。实际上,使用创建的字典也不是很简单!