5

私は現在ジェネリックをいじっています.テーブル名を指定するだけでデータベーステーブルからすべてをロードするために呼び出すことができる関数を作成しようとしています.

私はほとんどそこにいます。私の汎用メソッドはすべて機能しているように見えますが、結果を使用可能なものにキャストする方法がよくわかりません。

これは、これまでのメソッドの根性です。

private static List<EntityCodeBase> GetCodeLoadResults(CodeTables table)
{
    List<EntityCodeBase> results = new List<EntityCodeBase>();
    Assembly assm = Assembly.Load(new System.Reflection.AssemblyName("RR"));
    Type tableType = assm.GetTypes().Where(u => u.Name.ToLower() == table.ToString().ToLower()).FirstOrDefault();
    MethodInfo mi = typeof(SpecificEntity).GetMethod("LoadAll");

    mi = mi.MakeGenericMethod(tableType);
    mi.Invoke(null, null); //how can I cast the resulting object into a List<EntityCodeBase> ?

    return results;
}
4

1 に答える 1

5

SpecificEntity.LoadAllから派生した何らかのタイプのリストを返すと仮定するとEntityCodeBase、に直接キャストすることはできませんが、にキャストすることはList<EntityCodeBase>できますIEnumerable<EntityCodeBase>。次に、新しいリストを作成できます。

var ecbList = (IEnumerable<EntityCodeBase>)mi.Invoke(null, null);
return list.ToList();

ただし、名前で直接、属性を使用するか、マップを使用して、エンティティ型からテーブル名を取得できる場合は、よりクリーンになる可能性があります。GetCodeLoadResults次に、結果の型をジェネリックにすることができます。

private static List<T> GetCodeLoadResults() where T : EntityCodeBase
{
    Assembly assm = Assembly.Load(new System.Reflection.AssemblyName("RR"));
    Type tableType = //get table type from T
    MethodInfo mi = typeof(SpecificEntity).GetMethod("LoadAll");

    mi = mi.MakeGenericMethod(tableType);
    return (List<T>)mi.Invoke(null, null);
}

List<TDerived>.Net 4 を使用していない場合、 aを anにキャストできないため、最初IEnumerable<TBase>にキャストする必要があります。IEnumerable

return ((System.Collections.IEnumerable)mi.Invoke(null, null))
    .Cast<EntityCodeBase>()
    .ToList();
于 2013-02-06T21:44:24.960 に答える