私は特定のオブジェクトのSystem.Typeを持っていますが、それを型パラメータTとして別のメソッドに渡す必要があります。何とか可能ですか?あるいは私はそこで大きな写真を失っていますか?インスタンス化されたSystem.Typeから型パラメータTを取得しますか?
答えて
これはできません。それについて考えると、タイプパラメータはコンパイル時に解決されますが、System.Typeは実行時にリフレクションによって解決されます。
今、それは不可能だと言って、反射を使用することは可能です。リフレクションでクラスを作成する場合は、System.Typeをパラメータとして渡すことができますが、実行しようとしていることを何でも再設計するだけの価値があります。
編集:ここではデザインを変更するためのアイデアがあります。
System.Typeはどこから来たのですか?それを渡すことができるように型パラメータ自体として渡すことができますか?
そうでない場合は、使用される既知のタイプを処理するアダプタを作成できますか?おそらく、System.Typeから汎用コールの正しい種類に変換するswitch文ですか?反射よりも速いものがあります。
これは反射を使用して行うことができます。
代わりにデザインを変更したくないですか(リフラクションを避けるため)?したがって、あなたのタイプをパラメータとして渡すことができます:
別のデザインを使用することを検討してください。汎用型は、コンパイル時に静的に解決されることを意図しています。
それでも可能です。あなたは反射に頼る必要があります:
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);
}
}
あなたがして欲しいことは.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
}
あなたが通常行うことはこれらの操作の種類のために特別にジェネリックメソッドのオーバーロードを持つことです。例:
Load<T>();
Load(Type type);
これは、私が通常行うことですが、メソッドはサードパーティのものであり、SomeMethodを受け入れるのは
- 1. 型パラメータ - 型Tからコンクリートの型を取得:IMyInterfaceという
- 2. TabControlからContentTemplateのインスタンス化されたUIElementを取得する
- 3. WEBVIEWにアップロードされたURLからパラメータを取得します。
- 4. パラメータ化された型は何を意味しますか?
- 5. 変数の型を取得するには?それをインスタンス化しますか?
- 6. Swift - 関数から返された型からクラスをインスタンス化する
- 7. 別のクラスのフィールド型を使用してパラメータ化されたクラスをインスタンス化します
- 8. 返信リスト<T>のIOCからのインスタンス化されたクラス
- 9. 型がSystem.Typeとしてのみ知られている場合、型のデフォルト値を取得する方法は?
- 10. パラメータ化された型の同義語のインスタンスを宣言する
- 11. T-SQLパラメータのリストから別の値を取得
- 12. VB.NET nullable型の基になるsystem.typeを取得する
- 13. パラメータ化された型のアクセスクラス名
- 14. スカラ配列とパラメータ化された型
- 15. テンプレート以外のパラメータ化されたメソッドからテンプレートの型を返す
- 16. インスタンス化されたコンポーネントのxtypeを取得するには?
- 17. 自動化されたコントロールのサイズを取得しますか?
- 18. 宣言的にインスタンス化されたdojoインスタンスを取得する方法は?
- 19. Tが型パラメータでtが変数の場合、なぜ "t instanceof T"は許されないのですか?
- 20. javax.lang.model.VariableElementからパラメータ型を取得する方法
- 21. ネストされたクラスリストからフラットなリストを取得する方法<T>?
- 22. VBA ADODBは、パラメータ化クエリから取得パラメータは
- 23. 式から実際の戻り値の型を取得する<Func <T, object>>インスタンス
- 24. グループ化された結果から、行全体を取得
- 25. GCCから最適化されたソースコードを取得
- 26. pdfからコード化されたidentity-hからテキストを取得する方法
- 27. jglery.ajax()を使用してUglifyJSサービスから小型化されたJavaScriptコードを取得する方法は?
- 28. C#Genericsメソッドとxmlからメソッドで作成されたパラメータ化された型のオブジェクトを返す
- 29. DHTMLWindowからパラメータを取得
- 30. プロパティファイルからパラメータを取得
コードサンプルを投稿できますか? –