在我的代码中,我有两个接口:illookupable和illookuptable。ILookupTable有一个约束ILookupTable和一个IList属性。
我有一个服务与illookupables一起工作。有一个方法GetText(T容器…)有一个约束- illookupable。在GetText()方法中,如果容器参数中的LookupTable为空,它将调用另一个方法GetLookupTable,其中约束是针对illookuptable的。这将查询DB以查找必要的数据并返回。
我想做的是有一个illookupable的实例,使用它调用GetText,然后使用illookupable的illookuptable来调用GetLookupTable。但我不能让它工作。有没有一种不涉及反射的解决方案?
以下代码的主要部分:
public interface ILookupable<T> where T : ILookupTable {
public int Id { get; set; }
public IList<T> LookupTable { get; set; } = new List<T>();
}
public interface ILookupTable {
public int RefId { get; set;}
etc.
}
protected string GetText<T><T container, string lookup) where T : ILookupable<ILookupTable> {
blah blah blah
if (!container.LookupTable.Any())
container.LookupTable = GetLookupTable<*type of lookup table*>(container.Id);
}
protected IList<T> GetLookupTable(int refId) where T : ILookupTable {
blah blah return List<T>...
}
如果我没弄错的话,你主要关心的是这一行:
container.LookupTable = GetLookupTable<*type of lookup table*>(container.Id);
所以你想做一些类似于GetLookupTable<typeof(T)>
的事情?
很抱歉告诉你,但不能那样做。当以这种方式使用T时,编译器需要知道它的类型(这样它才能被编译),它不能在运行时设置。
但是有选项;首先(这是我最喜欢的)重写你的接口,实例需要满足你的GetLookupTable(没有T -因为实例已经"知道";你可以创建一个抽象基类,你也可以继承它,这样你就不需要为所有的实现编写那个方法了。
第二个是(我不推荐)一个巨大的"开关/工厂"式的";如果T = "某些类型"然后是GetLookupTable,但它很容易出错,老实说,这是不希望的。