2016-04-28 11 views
0

ためtypeofを使用:私は、このコードスニペットを持っている私のジェネリック型パラメータ

foreach (var item in allClassesINeedList) 
{ 
    var genericMethod = temp.GetType().GetMethod("GenerateDocument").MakeGenericMethod(typeof(item)); 
    genericMethod.Invoke(temp, new object[] { item }); 
} 

これはエラーがスローされます。

"The type or namespace name 'item' could not be found (are you missing a using directive or an assembly reference?)"

私の目的は、allClassesINeedList内のすべてのオブジェクトに対して実行することである(そのList<object>)私の一般的な方法GenerateSingleDocumentは、そのリスト内のすべてのオブジェクトとなります。

どうしたのですか?

答えて

3

あなたはitem.GetType()

+0

:あなたはその後、通常の方法でメソッドを呼び出すことができます'typeof(IDisposable)'です。オブジェクトの型を見つけるには 'GetType()'を使います。 – yaakov

1

typeof(item)を交換することができますが、リフレクションを使用する必要がありますか?反復処理を行うクラスを制御できる場合は、インタフェースを作成する方がよいでしょう。反射は遅く、可能な場合は避けるべきです。

public class YourClass : IDocumentCreator 
{ 
    // ... 

    public void GenerateDocument() 
    { 
     // ... 
    } 
} 

をそして代わりにList<object>List<IDocumentCreator>します

public interface IDocumentCreator 
{ 
    void GenerateDocument(); 
} 

は、あなたのクラスにこのインターフェイスを追加します。例えば、 `typeof`のみコンパイル時にコンパイラが知られているタイプで動作します - 拡大するには

List<IDocumentCreator> allClassesINeedList = ... 
foreach(IDocumentCreator item in allClassesINeedList) 
{ 
    item.GenerateDocument(); 
} 
+0

私はあなたのアプローチが好きですが、私の場合、私はrelfectionを使用する必要がありますが、thxs :) – kkkk00999