2012-02-06 8 views
9

System.Typeを汎用タイプ定義に変換したいので、Genericメソッドを呼び出すときに使用できます。基本的にはtypeofの逆です。ただ、いくつかのより多くの情報タイプを汎用クラス定義に変換する

public class BaseAppContext { 

    private Type settingsType; 

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

    public void MyFunction() { 
     MyStaticClass.GetData<classof(this.SettingsType)>(); 
    } 
} 

例は、(私は問題を抱えてどこclassofが本当の.NETメソッドではないとして、あなたは、表示されるように、私は真の解決策が必要だ「classof」を使用しました)なぜ私はこの奇妙な方法で問題を処理しているのですか? BaseAppContextは他の多くのクラスから参照されるクラスです。私がGenericにすると、コードの他の部分が変わることになりますが、これは私が望まないものです。私はフレームワークを書いているので、フレームワークで型を一度入力したいのですが、開発者はメソッドを呼び出すときに型を扱わなくても、提供された関数を使うことができます。

+0

これは意味をなさない。あなたは 'List 'で何ができますか?制約はどうですか? – SLaks

答えて

3

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

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

+0

Laks、[this](http://stackoverflow.com/questions/31771628/getting-the-dbcontext-dbsets-using-reflection-and-having-a-cast-to-the-properge)どのように進むべきですか? – Veverke

2

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

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

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

4

SettingsTypeが実行時に設定され、<>のコードがコンパイルされるため、これはできません。

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

をし、インターフェースまたは基本クラスにinstをキャスト:

あなたはこのようなあなたのタイプのインスタンスを作成することができます。

スタティッククラスを使用しているため、豊富な回答が優れています。

関連する問題