Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# - Fatal编程技术网

C# 传递类型并在中使用它们作为类型参数

C# 传递类型并在中使用它们作为类型参数,c#,C#,为什么我不能这样做: var myDictionary = new Dictionary<string, Type>(); // Add data to dictionary foreach(var kvPair in myDictionary) { var result = SomeMethod<kvPair.Value>(kvPair.Key); // Error } var myDictionary=newdictionary(); //向字典添加数据

为什么我不能这样做:

var myDictionary = new Dictionary<string, Type>();

// Add data to dictionary

foreach(var kvPair in myDictionary)
{
    var result = SomeMethod<kvPair.Value>(kvPair.Key); // Error
}
var myDictionary=newdictionary();
//向字典添加数据
foreach(myDictionary中的var kvPair)
{
var result=SomeMethod(kvPair.Key);//错误
}
因此,我不能使用Dictionary元素中的类型,也不能在Type参数中使用它。是的,我可以将字典发送给SomeMethod(KeyValuePair)。但是,我无法控制该功能的实现方式

错误:找不到类型或命名空间名称“kvPair”(是否缺少using指令或程序集引用?

我觉得我错过了一些非常基本的东西,我不知道它是什么

我觉得我错过了一些非常基本的东西,我不知道它是什么

是的,您缺少泛型参数是静态的,而不是动态的。它们在运行时不可发现。在您的情况下,一个选项是使用反射在运行时生成泛型方法调用:

foreach(var kvPair in myDictionary)
{
    // use reflection to create generic MethodInfo object
    MethodInfo mi = typeof(this).GetMethod("SomeMethod");
    MethodInfo mig = mi.MakeGenericMethod(kvPair.Value);

    // call generic method
    Object result = mig.Invoke(this, new object[] {kvPair.Key}); 

    // cast to desired return type.
}

然而,在走这条路之前,我会退后一步,看看泛型是否是最好的设计,因为你知道它们不会过时。

@JasonP虽然这是一个可能的解决方案,但我认为称它为复制品是一种延伸,因为在这个问题中根本没有提到泛型。@JasonP我与DStanley在一起。否则你可以推断这就是为什么它不起作用?只是解释为什么它不起作用,这在建议的副本中缺失了。这不是一个副本,而是一个相关的问题。啊,这现在很有意义。嗯……我喜欢这个解决方案,它很有趣,但idk如果我想使用反射来完成这一点。我必须做一些更多的思考我想做的事情我正在努力。谢谢!