私は特定のオブジェクトの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. Clojurescriptでレコードをパラメータ化されたレコードタイプからインスタンス化しますか?
- 3. TabControlからContentTemplateのインスタンス化されたUIElementを取得する
- 4. パラメータ化されたアクションから例外行を取得する
- 5. 型パラメータの問題:「パラメータ化された型から選択できません」
- 6. パラメータ化された型は何を意味しますか?
- 7. 変数の型を取得するには?それをインスタンス化しますか?
- 8. WEBVIEWにアップロードされたURLからパラメータを取得します。
- 9. 静的に解決された型パラメータの型を取得できますか?
- 10. フィールド要素からパッケージ名やパラメータ化型を取得します - 注釈プロセッサ
- 11. Scala 2.12、型パラメータをインスタンス化しますか?
- 12. Java ClassCastExceptionパラメータ化された型Eを汎用インスタンス「new ClazzXXX <E>()」から取る
- 13. タイプがインスタンス化されたテンプレートを取得します
- 14. Swift - 関数から返された型からクラスをインスタンス化する
- 15. パラメータ化されたクラスのインスタンス化
- 16. Dart 1.22.0のネストされたパラメータ化された型バインドされた新しい規則のインスタンス化
- 17. Jenkins pythonからパラメータ化された値を取得する方法
- 18. 別のクラスのフィールド型を使用してパラメータ化されたクラスをインスタンス化します
- 19. 返信リスト<T>のIOCからのインスタンス化されたクラス
- 20. 返されたインスタンスから値を取得する方法
- 21. JavaクラスオブジェクトをT型から取得する方法は?
- 22. 型パラメータの型パラメータをScalaのパラメータ化されたクラスに伝播することはできますか?
- 23. 型がSystem.Typeとしてのみ知られている場合、型のデフォルト値を取得する方法は?
- 24. インスタンス化されたGroovy String戻り型
- 25. VB.NET nullable型の基になるsystem.typeを取得する
- 26. urlから渡されたパラメータをmagentoで取得する
- 27. Haskellで作成された型から値を取得する
- 28. T-SQLパラメータのリストから別の値を取得
- 29. パラメータ化された型の同義語のインスタンスを宣言する
- 30. new()でインスタンス化されたインスタンスからEclipse Sisu作成Beanを取得する方法
コードサンプルを投稿できますか? –