3

C# では、コンパイル時にあるジェネリック型を別のジェネリック型にマップする方法はありますか? この質問にリフレクションを使用することは避けたいと思います。たとえば、TypeA を TypeB にマップし、次のようなコードが機能するとします。

private void List<U> GetItemList<T>() where T : class <== U is the destination type obtained by the compile-time mapping from T to U
{
    Type U = GetMappedType(typeof(T))   <=== this needs to happen during compile-time
    List<U> returnList = Session.QueryOver<U>().List();
    return returnList;
}

private Type GetMappedType(Type sourceType)
{
    if (sourceType == typeof(TypeA))
        return typeof(TypeB);
}

メソッド呼び出しを使用して型をマップしているため、コンパイル時にマッピングを実行しないことに気付きましたが、コンパイル時にのみ達成しようとしていることを達成する別の方法はありますか? 上記のコードが正しくないことはわかっていますが、私が何をしようとしているのかを理解していただければ幸いです。

要するに、ある型を別の型にマップし、C# コンパイラに型マッピングを認識させて、ジェネリック型パラメーターを受け取る任意のメソッドに対して、宛先型をジェネリック型パラメーターとして使用できるようにする方法があるかどうかを知りたいです。 . リフレクションの使用は避けたいと思います。

副次的な質問として、これにリフレクションを使用すると、実装が非常にリソースを消費することになりますか?

4

1 に答える 1

3

はいダイナミックが答えです。最近、データベースで構成されたいくつかの値に基づいてリポジトリを切り替える必要があるという同じ問題がありました。

var tableNameWithoutSchema = tableName.Substring(tableName.IndexOf(".", StringComparison.Ordinal) + 1);
var tableType = string.Format("Library.Namespace.{0}, Library.Name", tableNameWithoutSchema);
var instance = UnitofWork.CreateRepository(tableType, uoW);

CreateRepository は動的な型を返します

public static dynamic CreateRepository(string targetType, DbContext context)
{
    Type genericType = typeof(Repository<>).MakeGenericType(Type.GetType(targetType));
    var instance = Activator.CreateInstance(genericType, new object[] { context });
    return instance;
}

コンストラクターを介して汎用リポジトリにコンテキストを渡す必要があったため、コンテキストが必要でした。私の場合、このアプローチにはいくつかの問題がありました。これはあなたを助けるかもしれません。

于 2013-07-29T05:23:44.997 に答える