我知道答案不会很简单,而且我已经使用了几个(我认为丑陋的)结块。我只是在寻找一些优雅的答案。
抽象类:
public interface IOtherObjects;
public abstract class MyObjects<T> where T : IOtherObjects
{
...
public List<T> ToList()
{
...
}
}
孩子们:
public class MyObjectsA : MyObjects<OtherObjectA> //(where OtherObjectA implements IOtherObjects)
{
}
public class MyObjectsB : MyObjects<OtherObjectB> //(where OtherObjectB implements IOtherObjects)
{
}
是否有可能循环遍历 MyObjects 的集合(或其他类似的分组,通用或其他),然后使用MyObjects基类的ToList方法,因为此时我们不具体知道 T 的类型。
编辑 至于具体的例子,每当这个问题出现时,我已经考虑了一段时间,而是做了一些不同的事情,所以目前没有要求。但由于它经常出现,我想我会浮动它。
编辑 @Sara,这不是我关心的集合的具体类型,它可能是一个List,但每个实例的ToList方法仍然相对不可用,没有匿名类型)
@aku,是的,这个问题可能是相对假设的,但是能够检索并使用 T 对象列表,只知道它们的基本类型将非常有用。让 ToList 返回 BaseType 列表是我的解决方法之一
编辑@全部:到目前为止,这是我所希望的那种讨论,尽管它在很大程度上证实了我所怀疑的一切。到目前为止,谢谢大家,但其他任何人,请随时输入。
编辑@Rob,是的,它适用于已定义的类型,但不适用于该类型仅称为 IOtherObjects 列表。
@Rob再次感谢。这通常是我笨拙的解决方法(没有不尊重:))。或者使用 ConvertAll 函数通过委托进行向下转换。感谢您花时间了解问题。
合格的编辑,以防我有点困惑
更准确地说,(我可能让我最新的实现变得太复杂了):
假设我有 2 个对象类型,B 和 C 从对象 A 继承。
许多场景已经出现在哪里,从 B 列表或 C 列表,或者在其他情况下是其中之一的列表 - 但我不知道如果我在基类中,我需要一个不太具体的列表一种。
上面的例子是List Of Less Specific问题最新版本的一个淡化例子。
通常它已经呈现出来,因为我认为可能的场景会限制需要编写的代码量,并且看起来比其他选项更优雅一些。我真的很想讨论可能性和其他观点,我或多或少地得到了这些。我很惊讶到目前为止没有人提到 ConvertAll(),因为这是我使用的另一种解决方法,但对于手头的场景来说有点过于冗长
@Rob Yet Again和 Sara
谢谢,但是我确实觉得我理解泛型的所有静态上下文荣耀,并且确实理解了这里的问题。
我们系统的实际设计和泛型的使用(我可以这样说没有一点偏见,因为我只是设计中的参与者之一),已经做得很好。当我一直在使用核心 API 时,我发现我在错误的范围内简单地做某事,相反我不得不以比我喜欢的更不优雅的方式处理它们(尝试要么聪明或者可能是懒惰的——我会接受这些标签中的任何一个)。
我对我所说的 cludge 的厌恶主要是因为我们需要对记录集进行循环,只是为了将对象转换为它们的基本值,这可能会影响性能。
我想我想知道以前是否有人在他们的编码中遇到过这种情况,是否有人在处理它时比我更聪明,或者至少更优雅。