Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用函数传递的自定义类型创建字典C_C#_Dictionary - Fatal编程技术网

C# 使用函数传递的自定义类型创建字典C

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

我想创建一个字典,其中TKey作为字符串,TValue来自编译时未知的类型

比如说,我有一个函数

 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很明显,但我试图确定它是否真的需要,而不是在编译时知道类型。在字典甚至哈希表面前,你不知道类型的普通字典对我来说似乎很奇怪。是的,它有点奇怪。实际上,使用创建的字典也不是很简单!