Upcasting и универсальные списки

Ваш вопрос сбивает с толку ... вы хотите повернуть 2D-объект в плоскости экрана, верно? (Это то, что я предположил из вашей трансформации.) Так почему вы используете обе позиции мыши x и y? Ваше вращение является скалярным значением, поэтому вы должны просто использовать одну ось движения мыши.

Если вы вместо этого хотите повернуть свой объект, удерживая мышкой воображаемое кольцо вокруг объекта и поворачивая его ... тогда вам следует вместо этого сохранять ссылку на начальную позицию относительно центра объекта или начальный угол мыши относительно центра объекта. Может быть, что-то вроде этого:

private void Manipulator_OnManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
    if (e.Position.X > ContainerGrid.Width - RotateRectangle.Width && 
    e.Position.Y < ContainerGrid.Height - RotateRectangle.Height)
    {
    _isRotating = true;
    var startingRadians = Math.Atan2((currentLocation.Y - objectCenter.Y),     (currentLocation.X - objectCenter.X));
    startingAngle = startingRadians * 180 / Math.PI;
    return;
    }

    _isRotating = false;
}

private void Manipulator_OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{ 
    if (_isRotating)
    {
    Point currentLocation = e.Position;
    double radians = Math.Atan2((currentLocation.Y - objectCenter.Y),     (currentLocation.X - objectCenter.X));
    var angle = radians * 180 / Math.PI;
    RotateGrid.Angle = angle-startingAngle;
    }
}
5
задан DotnetDude 8 April 2009 в 15:26
поделиться

4 ответа

Да; добро пожаловать в дисперсию. В конечном счете, это не является списком BaseData - например, если у вас был другой подкласс, List будет (во время компиляции) позволять Вы .Добавьте это ... но тип времени выполнения не позволит вам. Компилятор мешает вам сделать ошибку.

В некоторых сценариях дженерики могут помочь здесь ... Я обсуждаю это в конце этой записи в блоге . Обратите внимание, что .NET 4.0 не применяется к спискам.

10
ответ дан 18 December 2019 в 07:32
поделиться

Это называется "ковариацией" по отношению к параметру вашей коллекции, и C # не поддерживает этот вид ковариация прямо сейчас. В C # 4.0 пользовательские типы и некоторые встроенные типы, такие как IEnumerable , будут поддерживать это.

Тем временем вы можете обойти это, создав новое перечисление с явно приведенными членами (вы можете подумать об изменении типов возвращаемых данных вашего материала здесь на IEnumerable , чтобы вам не приходилось постоянно создавать новые коллекции:)

public List<BaseData> Save()
{
    List<CoData> listCoData = GetData();
    return listCoData.Cast<BaseData>().ToList();
}

В зависимости от того, как GetData работает, вы также можете рассмотреть такую ​​структуру:

public List<T> Save<T>() where T : BaseData
{
    return listCoData = GetData<T>();
}

РЕДАКТИРОВАТЬ : На самом деле, как несомненно отметят Марк и другие, List может ' Это не может быть ковариантным, потому что вы можете добавлять элементы таким образом, чтобы это нарушало безопасность типов. Однако, если вы вместо этого отправили назад IEnumerable , вы можете использовать ковариацию здесь.

РЕДАКТИРОВАТЬ 2 : В ответ на ваш дополнительный вопрос:

Могу ли я это сделать? List listCoData = . ListBaseData.Cast () ToList ();

Нет. listBaseData.Cast (). ToList (); возвращает объект типа List , который нельзя напрямую привести к списку List . Вот почему мы должны были пойти на это в первую очередь.

8
ответ дан 18 December 2019 в 07:32
поделиться

Another variation on mquander's solution would be to implement Save as such:

public List<BaseData> Save()
{
    List<CoData> listCoData = GetData();
    return listCoData.ConvertAll<BaseData>(
        delegate(CoData c) { return c as BaseData; });
}

This would allow you to do some additional processing in the anonymous delegate, other than just casting it.

The important thing to remember here is that while CoData inherits from BaseData, List does not inherit from List.

2
ответ дан 18 December 2019 в 07:32
поделиться

Вам придется подождать до C # 4.0, чтобы использовать универсальную ковариацию .

1
ответ дан 18 December 2019 в 07:32
поделиться