すべてが同じ基本クラスから派生するオブジェクトのコレクションが与えられる場合があります。コレクションを反復処理して各項目の型を確認すると、オブジェクトが派生型であることがわかり、それに応じて処理できます。私が知りたいのは、既に行っていること以外に、派生型のチェックを実行する簡単な方法があるかどうかです。通常、コードの繰り返しは必要ないため、現在の方法論は少しずれているように思えます。
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 サービスの呼び出しごとに 1 つのメッセージを取得する代わりに、呼び出し先は 1 回の旅行ですべての間違い/成功を知ることができ、メッセージから特定の情報を解析する文字列を排除できます。
当初はジェネリックを使用することを考えていましたが、Web サービスはさまざまなメッセージ タイプを持つ可能性があるため、ベース メッセージ クラスを使用するようにコレクションが拡張されました。