型を汎用クラス定義に変換する

System.Type を汎用タイプ定義に変換したいので、Genericメソッドを呼び出すために使用できます。基本的に typeof の逆です。

例(私はclassofは本当の.NETメソッドではないので、どこに問題があるのか​​分かりやすいように実際のソリューションが必要な場所で "classof"を使用しています):

public class BaseAppContext {

    private Type settingsType;

    public Type SettingsType
    {
        get { return this.settingsType; }
        set { this.SettingsType = value; }
    }    

    public void MyFunction() {
      MyStaticClass.GetData();
    }
}

なぜ私はこの奇妙な方法を使って問題を処理しているのですか? BaseAppContextは他の多くのクラスから参照されるクラスです。私がGenericにすると、コードの他の部分が変わることになりますが、これは私が望まないものです。私はフレームワークを書いているので、フレームワークで型を一度入力したいのですが、開発者はメソッドを呼び出すときに型を扱わなくても、提供された関数を使うことができます。

10
それは意味をなさない。 List で何ができるでしょうか?制約はどうですか?
追加された 著者 SLaks,

3 答え

This won't be possible, since SettingsType is set at runtime and code between <> is compiled.

次のようにタイプのインスタンスを作成することができます:

var type = Type.GetType(SettingsType);
var inst = Activator.CreateInstance(type);

inst をインターフェイスまたは基底クラスにキャストします。

あなたは静的なクラスを使っているので、豊かな答えが良いです。

5
追加された

これは基本的に不可能です。
Genericsはコンパイル時の型を形成します。実行時にのみ既知の型からコンパイル時型を作成することはできません。

代わりに、リフレクションを使用するか、別のデザイン(非ジェネリックメソッドなど)を使用する必要があります。

4
追加された
Laks、 this は関連していると思われますが、どうすればいいですか?
追加された 著者 Veverke,

これを実現するには、リフレクションを使用する必要があります:

public void MyFunction() {
  var method = typeof(MyStaticClass).GetMethod("GetData").MakeGenericMethod(SettingsType);
  method.Invoke(null, null);
}

しかし、私はこれを行うことをお勧めしないで、あなたのソリューションを再設計するよう助言します。リフレクションを使用すると、言語が提供するすばらしいコンパイル時の安全性を忘れることになります。これにより、一般に、より脆く、保守性の低いコードになります。

3
追加された