2009-03-29 11 views

答えて

1

これはできません。それについて考えると、タイプパラメータはコンパイル時に解決されますが、System.Typeは実行時にリフレクションによって解決されます。

今、それは不可能だと言って、反射を使用することは可能です。リフレクションでクラスを作成する場合は、System.Typeをパラメータとして渡すことができますが、実行しようとしていることを何でも再設計するだけの価値があります。

編集:ここではデザインを変更するためのアイデアがあります。

System.Typeはどこから来たのですか?それを渡すことができるように型パラメータ自体として渡すことができますか?

そうでない場合は、使用される既知のタイプを処理するアダプタを作成できますか?おそらく、System.Typeから汎用コールの正しい種類に変換するswitch文ですか?反射よりも速いものがあります。

0

これは反射を使用して行うことができます。

代わりにデザインを変更したくないですか(リフラクションを避けるため)?したがって、あなたのタイプをパラメータとして渡すことができます:

0

別のデザインを使用することを検討してください。汎用型は、コンパイル時に静的に解決されることを意図しています。

それでも可能です。あなたは反射に頼る必要があります:

public class TypeReporter<T> { 
    public TypeReporter() { 
     Console.WriteLine("this type is: {0}", typeof(T)); 
    } 

    // other methods 
} 

public class StackOverflow694683 { 
    static void Main() { 
     string n = "..."; // Pick a type, such as System.String. 
     Type arg = Type.GetType(n); 
     Type genericClass = typeof(TypeReporter<>); 
     Type createdClass = genericClass.MakeGenericType(arg); 

     // Result is of TypeReporter<T> type. Invoke desired methods. 
     object result = Activator.CreateInstance(createdClass); 
    } 
} 
1

あなたがして欲しいことは.Netではできません。型パラメータは、.NET(C#およびVB)でのコンパイル・タイプ操作です。しかし、System.Typeインスタンスは実行時の構造です。 System.Typeの背後にある実数型のクエリは、実行時に発生する必要があります。したがって、このソリューションは互換性がありません。例については

public void DoSomething<T>(T value) { 
    // Do something with a value of type T 
} 

public Example1() { 

    DoSomething(42); // Calls DoSomething<int> 
    Type t1 = typeof(int); 
    DoSomething(t1); // Calls DoSomething<Type> 

    object o1 = 42; 
    Type t2 = o1.GetType(); 
    DoSomething(???) // No way to call DoSomething<int> here without some 
        // wild reflection because the call to DoSomething is 
        // established at compile type where t2 is established 
        // at runtime 
} 
0

あなたが通常行うことはこれらの操作の種類のために特別にジェネリックメソッドのオーバーロードを持つことです。例:

Load<T>(); 
Load(Type type); 
+0

これは、私が通常行うことですが、メソッドはサードパーティのものであり、SomeMethodを受け入れるのは()です。構造...それが私が求めていた理由です。 –

関連する問題