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 回答