2

エンティティ モデルを取得するためのジェネリック メソッドを作成しようとしています。だから、エンティティモデルの型を取り、その型のデータを返す機能を持つメソッドを作成しようとしています。

これが私がこれまでに持っているものです。

        public List<T> Generic<T>(List<T> users) where T : List<T>, new()
    {
        using (var entities = new TestDBEntities())
        {
            var enUsers = entities.Users; // How to replace this to make it generic?
            return enUsers.ToList();
        }
    }

ありがとう!

4

3 に答える 3

3

バージョン 4.1 以降 (DbContext を含む) を使用していますか?

そうでない場合、またはエンティティが ObjectContext の場合、次のようにリフレクションを介して ObjectSet を見つけることができます。

var objectSet = entities.GetType( ).GetProperties( )
    .Where( p => p.PropertyType.IsGenericType 
         && p.PropertyType.GetGenericArguments( )[ 0 ].Name == typeof( T ).Name )
    .Select( p => p.GetValue( entities, null ) as ObjectSet<T> )
    .First( );
return objectSet.ToList( );
于 2012-07-24T21:48:31.010 に答える
1

Set<>() メソッドを使用して、DbContext からエンティティを要求できます。したがって、この場合、取得できると思います。

entities.Set<T>();
于 2012-07-24T21:41:35.497 に答える
1

リフレクションを使用したくない場合は、これが代替手段です。

TestDBEntities は部分クラスなので、次のようなものを追加できます。

private Dictionary<Type, ObjectQuery> m_ObjectSets;
private Dictionary<Type, ObjectQuery> ObjectSets
{
    get
    {
        if( m_ObjectSets == null )
        {
            m_ObjectSets = new Dictionary<Type, ObjectQuery>( );
            m_ObjectSets[ typeof( YourTypeA ) ] = YourObjectSetA;
            m_ObjectSets[ typeof( YourTypeB ) ] = YourObjectSetB;
            ...
        }
        return m_ObjectSets;
    }
}

その後

    public ObjectSet<T> GetObjectSet<T>( ) where T : class
    {
        return ( ObjectSet<T> ) ObjectSets[ typeof( T ) ];
    }

あなたの呼び出しクラスは、

return entities.GetObjectSet<T>( );
于 2012-07-24T21:59:32.330 に答える