Использование ключевого слова dynamic работает в этом методе, как показано здесь, но я пытаюсь выяснить способ сделать это, не используя dynamic или var. Я бы хотел использовать общий подход. Есть ли какие-либо шаблоны или утилиты преобразования, которые я мог бы использовать?Преобразование из общего типа в другой тип в общий метод
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 ». Если метод может * только * когда-либо использовать «Радиан», то зачем делать его общим? Просто верните «Радиану». – David
Имеет ли 'TAngle' какие-либо ограничения? – dymanoid