为什么不创建一个接口(IRecordType
),允许RecordType1
和RecordType2
继承它,然后将每个Set
方法的主要逻辑移动到该接口中。
public interface IRecordType
{
void Set(...);
}
public void Set(IEnumerable<IRecordType> records)
{
foreach (var record in records)
{
record.Set(...);
}
}
这是一个更易于维护的解决方案。同时,它还允许更好的多态性。
编辑:参考资源:https://msdn.microsoft.com/en-us/library/3b5b8ezk%28v=vs.90%29.aspx
另外,小侧边栏提示:使用 interface
不仅可以共享某些方法,还可以共享属性和事件。如果 RecordType1
和 RecordType2
共享一些常见属性,则可以将这些属性添加到 interface
中,然后在以前需要区分这两个类型以使用这些属性、方法或事件的任何地方使用 IRecordType
。同样,任何这些属性、方法或事件内部的代码都允许依赖于对象本身特定的其他属性、方法、事件或字段。这是面向对象语言(如 C#)和多态性的目的。
编辑:由于评论中的讨论结果,我还想增加有关使用面向对象编程方法(interface
、abstract class
、class
)和 StriplingWarrior 建议的 dynamic
方法之间进行选择的更多信息:
如果您没有访问 RecordType1
或 RecordType2
的实际实现细节,或者由于依赖于 Set(RecordType1)
和 Set(RecordType2)
方法而无法更改应用程序的设计,则可能会发现使用 dynamic
的方法更为有效。还有其他一些选择,我们可能没有想到——您可以随时尝试其中之一。使用 dynamic
方法的缺点是它需要 .NET 4.0。
此外,还有更多考虑事项:如果您可以访问 RecordType1
和 RecordType2
的实现细节,但不能更改 Set(RecordType1)
和 Set(RecordType2)
的定义,则可以修改它们的主体:
public void Set(RecordType1 record)
{
record.Set(...);
}
public void Set(RecordType2 record)
{
record.Set(...);
}
这样做可以保留全部的应用程序结构,同时降低代码维护成本并允许多态性。
T
类中调用Set
方法,而是在当前类中调用。不确定为什么这个回答会得到这么多赞 :\ - Sriram Sakthiveltypeof
的情况。然而,这些情况并不满足 OP 的要求:也就是说,决策是在运行时做出的。 - Der Kommissar