【发布时间】:2020-03-12 17:36:45
【问题描述】:
public override void Test<T> T input)
{
if(input is TypeA)
{
var expected =input as TypeA;
foreach(var a in expected.Values)
{
// long process
}
}
else
{
var expected =input as TypeB;
foreach(var a in expected.Values)
{
//long process
}
}
如何声明
expected,这样我就不必编写两次foreach 语句了? TypeA 和 TypeB 没有任何关系。
【问题讨论】:
-
“漫长的过程”是一样的吗?两个
as的类型一样吗?你能使TypeA和TypeB相关吗? -
foreach 中的所有内容都是一样的。这些类型是通过 XSD 创建的,并且在反序列化时以任何方式关联它们都会产生问题。
-
创建一个公开
Values的接口,并使TypeA和TypeB都实现该接口...然后您可以对方法使用约束(where T: IHasValues)。否则,静态类型的 C# 没有鸭子类型...如果TypeA和TypeB不相关,唯一可行的方法是使用dynamic并让运行时找到Values属性 -
" 这些类型是通过 XSD 创建的,并且在反序列化时以任何方式关联它们都会产生问题。"你如何序列化它?你可以有一个公共的父类,如果你在子类上写适当的属性,它将被正确序列化。
-
here is an example 的如何用继承解决序列化