これには大変な手間がかかりましたが、私はそれを処理しました。
TypeSwitchコードを使用して型を切り替えられるようにするために、最初に次のコードを書きました。
public Mapping<Address, DatabaseAddress> DatabaseAddress { get; }
public Mapping<T1, T2> GetMapping<T1, T2>()
{
Mapping<T1, T2> retMapping = null;
TypeSwitch.Do(
typeof (T1),
TypeSwitch.Case<Address>(() =>
TypeSwitch.Do(
typeof (T2),
TypeSwitch.Case<DatabaseAddress>(() => retMapping = AddressToDatabaseAddressMapping)
));
return returnedMapping;
}
retMapping = AddressToDatabaseAddressMapping
に自動的に割り当てることができないため、コンパイラ エラーが発生してい Mapping<Address,DatabaseAddress>
ましたMapping<T1,T2>
。ここではヒューリスティックに同じものであったとしても、論理的に同じものではありません。
object
ただし、型を活用することで、C# を動的言語として効果的に動作させることができます。
public Mapping<Address, DatabaseAddress> DatabaseAddress { get; }
public Mapping<T1, T2> GetMapping<T1, T2>()
{
object retMapping = null;
TypeSwitch.Do(
typeof (T1),
TypeSwitch.Case<Address>(() =>
TypeSwitch.Do(
typeof (T2),
TypeSwitch.Case<DatabaseAddress>(() => retMapping = AddressToDatabaseAddress),
));
var returnedMapping = (Mapping<T1, T2>) retMapping;
return returnedMapping;
}
これは要点を示すのに必要以上に冗長ですがAddressToDatabaseAddress
、静的な型がその必要性を暗示していなくても、実行時に はその ID を維持することに注意してください。そして、ヒューリスティックにMapping<T1, T2>
ISMapping<Address, DatabaseAddress>
であるため、実行時に適切に割り当てられ、完全に機能します。
ただし、作成して適切に動作TypeSwitch
させるにはtypeof(T1)
、何かを追加する必要があることに注意することが重要です。渡さtypeof(T2)
れるデフォルトでの記述方法は です。これは、必要な動作ではありません! ただし、次のオーバーロードを追加します。object source
System.Type
public static void Do(Type source, params CaseInfo[] cases)
{
foreach (var entry in cases.Where(entry => entry.IsDefault || entry.Target.IsAssignableFrom(source)))
{
entry.Action(source);
break;
}
}
意図したとおりに動作します。System.Type
オーバーロードはオーバーロードよりも具体的であるため、System.Object
フレームワークはそれを使用することを好みます。誰かTypeSwitch
がタイプを直接投げることを好む場合、一般的なユースケースでもう少し正気になります。