首先,看类定义: Persons为一个实体类。public class IMSDB
{
   public DBSet<Person> Persons { get; set; } 
 }public class DBSet<TEntity>
{
   public bool Del(int id)
  { 
    return true;
   }
}在调用的地方:IMSDB IMSDB = new IMSDB();
IMSDB.Persons.Del(1);我想以IMSDB.Persons.Del(1);这种方式调用,但现在这种肯定不行,会说没有实例化。如果改成静态的,会报错:请改用类型名来限定它,我只想用IMSDB.Persons.Del调用而不加限定,请问用什么方法能实现这种调用方式?非常感谢。好像可以通过IMSDB继承一个类来实现DBSet的实例化,类似于EF中继承的DBContext就可以实现这个效果,但我不明白他的原理,请问具体怎么做呢?

解决方案 »

  1.   

    我在IMSDB类的构造函数里写了个反射实例化、但是item.SetValue(t, o, null);的时候报错,请教下应该怎么写?这些实例化的操作能否放到DBController里进行?谢谢。    public class IMSDB : DBController
        {
            public DBSet<Memo> Memos { get; set; }
            public DBSet<Person> Persons { get; set; }
            public DBSet<User> Users { get; set; }         public IMSDB()
            {
                //Persons = new DBSet<Person>();
                var type = this.GetType();
                 //反射解析 获取成员列表
                System.Reflection.PropertyInfo[] properties = type.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
                if (properties.Length > 0)
                {
                    foreach (System.Reflection.PropertyInfo item in properties)
                    {
                        Type t = item.PropertyType.GetGenericArguments()[0];  //泛型中实体的类型
                        object o = t.GetConstructor(new Type[0]).Invoke(new object[0]); //实例化实体类                    item.SetValue(t, o, null);
                  }}}
      

  2.   

    IMSDB imsdb= new IMSDB();// 不要把变量名定义成与类名一样
    imsdb.Persons = new DBSet<Person>();  //使用前要先实例化
    //....
    imsdb.Persons.Del(1);
      

  3.   

    关键是,我不想实例化,能否隐藏这个过程或放到继承的类里面。类似EF中的DBContext的操作。
      

  4.   

    那就在IMSDB的构造函数初始化
    public class IMSDB
    {
       public DBSet<Person> Persons { get; set; }  
        public IMSDB()
        {
              persons=new dbset<person>();
        }
     }
    IMSDB imsdb = new IMSDB();
    imsdb.Persons.Del(3);
      

  5.   

    就没有别的方法了吗? 我反编译 EF中的DBContext和DbSet类 也没有在这两个地方实例化 用什么方式调用的呢?求解答,有正确答案要多少分都行。
      

  6.   

    举个EF中的例子吧,在MusicStore中
      using System.Data.Entity; 
      public class MusicStoreEntities : DbContext 
      { 
            public DbSet<Album> Albums { get; set; } 
            public DbSet<Genre> Genres { get; set; } 
      } 
    调用的时候只需要
    MusicStoreEntities obj = new MusicStoreEntities();
    obj.Albums.Create();
    Albums是普通的实体类,并没有实例化,也可以调用Create();方法,具体实现原理是什么呢?
      

  7.   

    那你看过MusicStoreEntities的构造函数了吗?
      

  8.   

    public class IMSDB
    {
       public DBSet<Person> Persons { get; set; }  
        public IMSDB()
        {
              persons=new dbset<person>();
        }
     }
    IMSDB imsdb = new IMSDB();
    imsdb.Persons.Del(3);  这个就可以啊
    有兴趣的朋友可以加入net开源交流群,共同探讨学习69594961
      

  9.   

    MusicStoreEntities的构造函数 里不用实例化的。哪位高手去反编译一下EF框架,帮我看看实现的方法。主要是DBSet和DbContext 类,我发现继承DbContext 后就可以不用实例化了,不继承的时候依然报错。回复windowslinuxjavanet我就是想不实例化直接调用。如何在继承的DbContext类里实现?