Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как преобразовать myClass<myType> в myClass<objec>


Автор: Tereha 17.2.2013, 10: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>

получаю сообщение, что такое преобразование невозможно. 
 Возможно кто-то сможет подсказать, как обойти эту проблему?

Автор: dzaraev 5.9.2013, 07:50
Чтобы осуществить преобразование, подобное этому
Код

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

Вам необходима вариация generic-параметра.
Про вариацию в C# можно прочитать на MSDN: http://msdn.microsoft.com/ru-ru/library/dd799517(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>
    {
        
    }

    class MyViewModel : IWorkspaceViewModel<MyType>
    {
        
    }

    class MyType
    {
         
    }

Подробности узнаете, если пройдёте по ссылке, которую я привел выше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)