2011-03-28 57 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 {} 
}