ジェネリックスとLinqに関する問題

私は次のようなクラス名のリストを持っています:

Type[] typelist = typeof(Sample.Students).Assembly.GetTypes();

今、私はSample NameSpaceで利用可能なすべてのクラスの完全なリストを持っています:

今私はクラスを介してデータを取得したい 私はDevexpress Persistanceクラスを使用しています だから、基本的に私は次のようにXPQuertオブジェクトを作成する必要があります:

XPQuery EmployeeQuery = new  XPQuery(XPODefault.Session);

私の場合、 Employee クラスはタイプリスト変数にリストされます。 XPQueryのオブジェクトを作成するにはどうすればよいですか?

XPQuery EMployeeQuery = new XPQuery (XPODefault.Session);

私は動的にオブジェクトを作成したいと思っていました..どうすればいいですか ありがとう..

1

2 答え

次のようなことができます:

public static IQueryable CreateQueryInstance(Type queryType) 
{
    var genericQueryTypeDefinition = typeof(XPQuery<>);
    var queryTypeArguments = new[] { typeof(queryType) };
    var genericQueryType = genericQueryTypeDefinition.MakeGenericType(queryTypeArguments);
    var queryObject = (IQueryable)Activator.CreateInstance(genericQueryType, );

    return queryObject;
}

そしてそれを次のように使います:

var myQueryObject = CreateQueryInstance(typelist[0]);

もちろん、コンパイル時に型がわからないので、素敵なXPQueryを持つことはできませんが、IQueryableから開始することはできます。

2
追加された
返信いただきありがとうございます。しかし、インスタンスの作成時にどのようなパラメータを渡す必要がありますか?
追加された 著者 ghanshyam.mirani,
実際にXPQueryの<...>コンストラクタに渡すパラメータの配列を渡す必要があります。たとえば、セッション:Activator.CreateInstance(genericQueryType、new object [] {XPODefault.Session});
追加された 著者 Alexey Raga,
常に同じパラメータ(XPODefault.Session)であれば、そこにハードコードすることができます。それ以外の場合は、CreateQueryInstanceメソッドのパラメータとして使用することをお勧めします。
追加された 著者 Alexey Raga,

リフレクションを使用して、ジェネリック型を動的に構築できます。

Type queryType = typeof(XPQuery<>);
Type[] typeArgs = { typelist[0] };

Type constructed = queryType .MakeGenericType(typeArgs);
object myQuery = Activator.CreateInstance(constructed, XPODefault.Session);

CreateInstance(type、params Object [] args)を使用する必要があります。オーバーロードのため、コンストラクタに必要な引数を指定できます。

唯一の問題は、 CreateInstance の戻り値の型が object 型であることです。 myQuery の他のメソッドを呼び出す場合は、リフレクションまたは dynamic キーワードを使用する必要があります。

1
追加された
返信いただきありがとうございます:インスタンスを作成する際に例外が発生しました: "このオブジェクトに対して定義されたパラメータのないコンストラクタはありません。"
追加された 著者 ghanshyam.mirani,
私は、記事を読んで、パラメータとしてXPODefault.Sessionを渡しました。でも、私は別の例外を取得しています。「例外は呼び出しのターゲットによってスローされました。」
追加された 著者 ghanshyam.mirani,
@ ghanshyam.mirani私は自分の答えを編集し、CreateInstanceの正しいオーバーロードへのリンクを追加しました。
追加された 著者 Wouter de Kort,
内側の例外とは何ですか?
追加された 著者 Wouter de Kort,