2011-03-28 75 views
1

我有以下代码:泛型和动作代表

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.

我可以通过一个通用的方法作为参数设置为另一种方法?

这里有什么问题?

谢谢。

回答

2

你可能只需要指定类型:

public void generate() 
{ 
    base.generateFoo<YourType>(Method); 
} 

话虽这么说 - 上面的代码,因为写的,不会编译,因为generateFoo不是泛型方法也不是一个通用类,所以它的上述可能不起作用。假定generateFoo被定义为一种通用方法(以T的类型)。

+0

我只是一个smidge太慢:) – KeithS 2011-03-28 19:08:09

+0

它是一种通用的方法。抱歉。 – DarthVader 2011-03-28 19:12:05

+0

但我得到:变量不能用作类型参数错误。基类内的 – DarthVader 2011-03-28 19:12:27

1

您可以使generateFoo通用于T,与Method具有相同的限制。你的例子实际上不会编译,因为T对于MyBase是未知的(除非你在一个已知的命名空间中实际上有一个名为T的类)。

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