我有一个类lxml.html
,该类返回Table
的集合,例如:
Entity
Table<Song> table = database.GetTable("SongCollection");
是Song
的子类。 Entity
还实现了一个接口Table
,而ITable
实现了一个名为Entity
的接口。
但是,致电:
IEntity
或
ITable<IEntity> table = database.GetTable("SongCollection");
或
ITable<Entity> table = database.GetTable("SongCollection");
或
Table<Entity> table = database.GetTable("SongCollection");
全部返回null。
我可以打电话给Table<IEntity> table = database.GetTable("SongCollection");
并返回一个table.GetAll()
并将每个单独的List<Song>
投射到一个Song
上。
在IEntity
的情况下我应该怎么做,以免我在进行行政管理时不必返回Table
来获得List<dynamic>
一般在所有Table
上执行CRUD操作的界面?
答案 0 :(得分:0)
解决这个问题的方法实际上很奇怪,感谢Igor帮助我朝着正确的方向前进。
因此,我确实将输出类型从List<T>
更改为IEnumerable<T>
,而我的代码没有任何大的崩溃,我的最终接口看起来像这样:
public interface ITable<out T> where T : IEntity {
string TableName { get; set; }
Database CurrentDatabase { get; set; }
T New();
T Get(ulong id);
IEnumerable<T> GetAll();
void LoadAllStorageFiles(IEnumerable<IEntity> storage);
void StoreAllStorageFiles(IEnumerable<IEntity> storage);
void LoadRelated(IEntity current);
void LoadRelated(IEnumerable<IEntity> current);
}
当我将协变量方法和不变变量(最初为Contravariant)方法分离为不同的接口类型时,协变量将强制转换,而变量将在强制转换期间变为空。
这是很奇怪的部分,这是我最初的Contravariant方法:
void LoadAllStorageFiles(IEnumerable<T> storage);
void StoreAllStorageFiles(IEnumerable<T> storage);
void LoadRelated(T current);
void LoadRelated(IEnumerable<T> current);
现在,您会认为使键入更为严格,使其只接受与Table其余部分相同的泛型类型,这将具有隐含意义。但是,在这种情况下,在运行时它被视为是反变的,运行时只是放弃而为您提供null而无一例外。在这种情况下,将参数设为LoadRelated等,而不是T,而不是T,这样,无论Twilight Zone'ish是什么,您现在都使其变得不太严格,因为现在参数已向任何IEntity开放,这似乎对表明在某些矛盾的情况下可能应该对运行时环境进行某些假设假设,但可能会花费更多的代码,精力和金钱来解决这个问题,这足以满足运行时环境的检查要求,并且您能够继续前进。
因此,我只在这里指出遇到这种情况并耸耸肩的其他人。也许有人可以在评论中阐明一些观点。