Как преобразовать myClass<myType> в myClass<objec>

 
0
 
.NET
ava
Tereha | 17.02.2013, 11:18
Уважаемые Гуру!
В TabControl ItemsSource связывается с ObservableCollection содержащей набор generic ViewModel. С помощью generic я настраиваю ViewModel на заданный тип объекта edm. В настоящий момент мне кажется, что должно быть нечто вроде

ObservableCollection<WorkspaceViewModel<object>> _workspaces;



и новый элемент включается в коллекцию как-то вроде

workspace = new myViewModel() as WorkspaceViewModel<object>;
Workspaces.Add(workspace);
SetActiveWorkspace(workspace);

где

class myViewModel() : WorkspaceViewModel<myType>

Но на преобразовании

new myViewModel() as WorkspaceViewModel<object>

получаю сообщение, что такое преобразование невозможно.
Возможно кто-то сможет подсказать, как обойти эту проблему?
Ответы (1)
ava
dzaraev | 05.09.2013, 07:50 #
Чтобы осуществить преобразование, подобное этому

workspace = new myViewModel() as WorkspaceViewModel<object>;

Вам необходима вариация generic-параметра.
Про вариацию в C# можно прочитать на MSDN: http://msdn.microsoft.com/ru-ru/library/dd...(v=vs.100).aspx
В вашем случае не получится сделать именно так, как вы хотите, т.к. вариация применяется только к интерфейсами делегатам.
Это значит вместо класса WorkspaceViewModel<T>; вам необходимо будет объявить интерфейс IWorkspaceViewModel<out T>
Это будет означать, чтоб можно выполнить преобразование

IWorkspaceViewModel<MyType> -> IWorkspaceViewModel<Object>

При условии, что MyType - ссылочный тип.
Таким образом, вам даже не придется выполнять преобразование явно через оператор as, вы можете просто добавить экземпляр
MyViewModel в коллекцию типов IWorkspaceViewModel<object>.
Вот так приблизительно нужно переписать ваш пример, чтобы он заработал:

    class Program
    {
        static ObservableCollection<IWorkspaceViewModel<object>> _workspaces;

        static void Main()
        {
            _workspaces = new ObservableCollection<IWorkspaceViewModel<object>>();

            var workspace = new MyViewModel();
            _workspaces.Add(workspace);
        }
    }

    interface IWorkspaceViewModel<out T>
    {
        T GetFoo();
    }

    class MyViewModel : IWorkspaceViewModel<MyType>
    {
        public MyType GetFoo()
        {
            return new MyType();
        }
    }

    class MyType
    {
         
    }
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Tereha   dzaraev
advanced
Отправить