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如果我想使用反射来完成这一点。我必须做一些更多的思考我想做的事情我正在努力。谢谢!