dynamicというキーワードを使用すると、ここに示すようにこのメソッドで動作しますが、dynamicまたはvarを使用せずに行う方法を見つけようとしています。私は一般的なアプローチを使用したいと思います。私が使用できるパターンや変換ユーティリティはありますか?generic型から別の型に汎用メソッドを変換する
public static TAngle AngleBetween<TAngle>(Vector vector1, Vector vector2) where TAngle : IAngle
{
dynamic radians = (Radian)AngleBetween(vector1, vector2);
return (TAngle)radians;
}
これは望ましい結果が得られますが、それはリスコフの原則に違反:
public static TAngle AngleBetween<TAngle>(Vector vector1, Vector vector2) where TAngle : IAngle
{
double result = AngleBetween(vector1, vector2);
Radian resultRadian = new Radian(result);
Degree testDegree = new Degree();
DegreeMinuteSecond testDMS = new DegreeMinuteSecond();
Gradian testGradian = new Gradian();
Turn testTurn = new Turn();
if (typeof(TAngle) == typeof(Degree))
{
testDegree = (Degree)resultRadian;
return (TAngle)(object)testDegree;
}
else if (typeof(TAngle) == typeof(DegreeMinuteSecond))
{
testDMS = (DegreeMinuteSecond)resultRadian;
return (TAngle)(object)testDMS;
}
else if (typeof(TAngle) == typeof(Gradian))
{
testGradian = (Gradian)resultRadian;
return (TAngle)(object)testGradian;
}
else if (typeof(TAngle) == typeof(Turn))
{
testTurn = (Turn)resultRadian;
return (TAngle)(object)testTurn;
}
else return (TAngle)(object)resultRadian;
}
を誰もが何か提案がありますか?
これに答えるには、ここでは 'Radian'と' IAngle'の実装が必要だと思います。 – Jamiec
私は、コンパイラが 'TAngle'が常に' Radian'になることを保証することはできません。もしそのメソッドが 'Radian'を使うことができるのであれば、なぜ最初にgenericにするのでしょうか? 'Radian'を返すだけです。 – David
'TAngle'に制約はありますか? – dymanoid