我有一个案例,其中给出了一个对象集合,这些对象都派生自同一个基类。如果我遍历集合并检查每个项目的类型,我可以看到该对象是派生类型,然后相应地处理它。我想知道的是,除了我已经在做的事情之外,是否还有一种更简单的方法来检查派生类型。通常不需要重复代码,所以我目前的方法对我来说似乎有点不对劲。
class A {}
class B : A {}
class C : A {}
class D : C {}
class Foo
{
public List<A> Collection { get; set; }
}
class Bar
{
void Iterate()
{
Foo f = new Foo();
foreach(A item in f.Collection)
{
DoSomething(a);
}
}
void DoSomething(A a)
{
...
B b = a as B;
if(b != null)
{
DoSomething(b);
return;
}
C c = a as C;
if(c != null)
{
DoSomething(c);
return;
}
D d = a as D;
if(d != null)
{
DoSomething(d);
return;
}
};
void DoSomething(B a){};
void DoSomething(C a){};
void DoSomething(D a){};
}
我正在使用一个 Web 服务,其中每个 Web 服务都必须具有相同的结果类型。
class WebServiceResult
{
public bool Success { get; set; }
public List<Message> Messages { get; set; }
}
class Message
{
public MessageType Severity { get; set; } // Info, Warning, Error
public string Value { get; set; } //
}
class InvalidAuthorization: Message
{
// Severity = MessageType.Error
// Value = "Incorrect username." or "Incorrect password", etc.
}
class InvalidParameter: Message
{
// ...
}
class ParameterRequired: InvalidParameter
{
// Severity = MessageType.Error
// Value = "Parameter required.", etc.
public string ParameterName { get; set; } //
}
class CreatePerson: Message
{
// Severity = MessageType.Info
// Value = null
public int PersonIdentifier { get; set; } // The id of the newly created person
}
目标是我们可以根据需要向客户端返回尽可能多的不同类型的消息。与每次 Web 服务调用获取一条消息不同,被调用者可以在一次行程中了解他们所有的错误/成功,并消除从消息中解析特定信息的字符串。
我最初考虑使用泛型,但由于 Web 服务可能具有不同的消息类型,因此该集合被扩展为使用基本消息类。