2016-11-16 11 views
-3

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; 

    } 

を誰もが何か提案がありますか?

+3

これに答えるには、ここでは 'Radian'と' IAngle'の実装が必要だと思います。 – Jamiec

+2

私は、コンパイラが 'TAngle'が常に' Radian'になることを保証することはできません。もしそのメソッドが 'Radian'を使うことができるのであれば、なぜ最初にgenericにするのでしょうか? 'Radian'を返すだけです。 – David

+0

'TAngle'に制約はありますか? – dymanoid

答えて

4

コンパイラは、これは常に成功することを保証することはできません:すべての後に

TAngle radians = (Radian)AngleBetween(vector1, vector2); 

を、TAngleRadian以外の何か何ですか?

where TAngle : IAngle 

しかしRadianが今までIAngleを実装する唯一のものであることはコンパイル時の保証はありません。それに制約があります。

したがって、エラーです。

ただし、このメソッドの実装が与えられていれば、最初は汎用ではありません。

public static Radian AngleBetween(Vector vector1, Vector vector2) 
{ 
    Radian radians = (Radian)AngleBetween(vector1, vector2); 

    return radians; 
} 

それとも、あなたも仕事とIAngleを返すようにしたい場合は:何かあれば

public static IAngle AngleBetween(Vector vector1, Vector vector2) 
{ 
    IAngle radians = (Radian)AngleBetween(vector1, vector2); 

    return radians; 
} 

ジェネリック医薬品が有用であり、あなたは常にだけRadianを返し、Radianを返すようにしたいので、さまざまな種類がありますが、この実装は、キャストによって、特定の1つの型の使用を主張します。

+0

このユーザーには、現在の質問が立っているために得られるベストアンサーについてです。 – Jamiec

関連する問題