我有以下代码:
public void generate()
{
base.generateFoo(Method); // How can i indicate the type here?
}
public void Method<T>(T t , IDictionary<T, SomeObject> coll) : where T : ISomething
{
// do something
}
class MyBase
{
public void generateFoo<T>(Action<T, IDictionary<T, SomeObject>> Method) : where T : ISomething
{
Method.invoke(ObjectThatImplementsT, DictionaryWIthTKey);
}
}
我收到的错误就像无法将ObjectThatImplementsT转换为T.
我可以将泛型方法作为参数传递给另一种方法吗?
这里有什么问题?
感谢。
答案 0 :(得分:2)
您可能只需要指定类型:
public void generate()
{
base.generateFoo<YourType>(Method);
}
话虽如此 - 上面的代码,如上所述,将无法编译,因为generateFoo
不是泛型方法,也不是泛型类,所以上述代码可能不起作用。假设generateFoo
被定义为通用方法(采用类型T
)。
答案 1 :(得分:1)
您可以使generateFoo
对T具有通用性,但具有与Method相同的限制。您的示例实际上不会编译,否则,MyBase不知道T(除非您在已知命名空间中实际上有一个名为T的类)。
答案 2 :(得分:1)
以上所有内容都适用于大量的小编辑(为什么不亲自编译样本,以便我们知道'问题'是假的,你的问题到底是什么?!)
这是一个编译位 - 注意调用generateFoo的三种变体:
using System.Collections.Generic;
using System;
namespace X
{
class Y : MyBase
{
public static void Main(string[]args) { }
public void generate()
{
base.generateFoo<Something>(Method<Something>); // works
base.generateFoo<Something>(Method); // works as well
base.generateFoo(Method<Something>); // doesn't (cannot be inferred)
}
public void Method<T>(T t , IDictionary<T, SomeObject> coll)
where T : ISomething
{
// do something
}
}
class MyBase
{
public void generateFoo<T>(Action<T, IDictionary<T, SomeObject>> Method)
where T : class, ISomething
{
Method.Invoke((T) null, new Dictionary<T,SomeObject>());
}
}
internal interface ISomething {}
internal class Something : ISomething {}
internal class SomeObject {}
}