泛型和行动代表

时间:2011-03-28 19:02:05

标签: c# .net generics delegates action

我有以下代码:

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.

我可以将泛型方法作为参数传递给另一种方法吗?

这里有什么问题?

感谢。

3 个答案:

答案 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 {}
}