2009-07-29 1 views
11

Как я могу броситьКак я могу бросить в ObservableCollection <object>

from ObservableCollection<TabItem> into ObservableCollection<object> 

это не работает для меня

(ObservableCollection<object>)myTabItemObservableCollection 
+2

Это называется ковариация, и он еще не доступен в C# –

+1

(а для коллекций также будет недоступен в 4.0) - –

ответ

12

вы должны скопировать как этот

return new ObservableCollection<object>(myTabItemObservableCollection); 
+0

вы забыли ключевое слово 'new' –

+0

спасибо Dr ew, я добавил его –

+1

.net 4 НЕ решает эту проблему, как указано в сообщении Марка Гравелла. – MrSlippers

0

Вы не можете. ObservableCollection<TabItem> не происходит от ObservableCollection<object>.

Если вы объясните, почему вы хотите, возможно, мы можем указать альтернативный интерфейс, который вы можете использовать.

11

В принципе, вы не можете. Не сейчас, и not in .NET 4.0.

Каков именно контекст здесь? Что тебе нужно? LINQ имеет Cast<T>, который может предоставить вам данные как последовательность , или есть некоторые трюки с общими методами (т. Е. Foo<T>(ObservalbleCollection<T> col) и т. Д.).

Или вы можете просто использовать не общий IList?

IList untyped = myTypedCollection; 
untyped.Add(someRandomObject); // hope it works... 
4

вы могли бы использовать IEnumerable.Cast<T>()

0

спасибо за все ответы, но я думаю, что я решить эту проблему самостоятельно с «helpermethode».

Возможно, для этого есть лучший метод или инструкция linq.

private void ConvertTabItemObservableCollection() 
{ 
    Manager manager = this.container.Resolve<Manager>(); 
    foreach (var tabItem in manager.ObjectCollection) 
    { 
    TabItemObservableCollection.Add((TabItem)tabItem); 
    } 
} 
+0

Поскольку мы не знаем, на что набирается ObjectCollection, это довольно сложно ответить ... –

+0

Я не понимаю, что означает u ?! У меня есть TabItem, что я хотел бы добавить в ObservableCollection из объекта типа. «Менеджер» - это глобальные классы с ObservableCollection , что мне нужно в любых представлениях/компонентах моего приложения призмы. –

+0

Ах, извините, я неправильно понял ур. Ответ. «ObjectCollection» набирается как объект ObservableCollection

0

Ни один из примеров, которые я нашел, не работал для меня, я объединил приведенный ниже код и, похоже, сработал. У меня есть иерархия, созданная десериализацией XML-файла, и я могу перебирать все объекты в иерархии, но вы можете адаптировать это, чтобы просто пропустить один ObservableCollection и получить объекты как объекты, а не строго типизировать.

Я хочу добавить PropertyChangingEventHandler для каждого свойства в иерархии, чтобы я мог реализовать функциональность отмены/повтора.

public static class TraversalHelper 
{ 

    public static void TraverseAndExecute(object node) 
    { 
     TraverseAndExecute(node, 0); 
    } 

    public static void TraverseAndExecute(object node, int level) 
    { 
     foreach (var property in node.GetType().GetProperties()) 
     { 
      var propertyValue = node.GetType().GetProperty(property.Name).GetGetMethod().Invoke(node, null); // Get the value of the property 
      if (null != propertyValue) 
      { 
       Console.WriteLine("Level=" + level + " : " + property.Name + " :: " + propertyValue.GetType().Name); // For debugging 
       if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(ObservableCollection<>)) // Check if we are dealing with an observable collection 
       { 
        //var dummyvar = propertyValue.GetType().GetMethods(); // This was just used to see which methods I could find on the Collection 
        Int32 propertyValueCount = (Int32)propertyValue.GetType().GetMethod("get_Count").Invoke(propertyValue, null); // How many objects in the collection 
        level++; 
        for (int i = 0; i < propertyValueCount; i++) // Loop over all objects in the Collection 
        { 
         object properyValueObject = (object)propertyValue.GetType().GetMethod("get_Item").Invoke(propertyValue, new object[] { i }); // Get the specified object out of the Collection 
         TraverseAndExecute(properyValueObject, level); // Recursive call in case this object is a Collection too 
        } 
       } 
      } 
     } 
    } 
} 

метод так и называется, как этот

TraversalHelper.TraverseAndExecute(object); 

Если вы просто хотите создать коллекцию объектов нужно просто этот кусок кода

ObservableCollection<Field> typedField = migration.FileDescriptions[0].Inbound[0].Tables[0].Table[0].Fields[0].Field; // This is the strongly typed decalaration, a collection of Field objects 
object myObject = typedField; // Declare as object 
Int32 propertyValueCount = (Int32)myObject.GetType().GetMethod("get_Count").Invoke(myObject, null); // How many objects in this Collection 
for (int i = 0; i < propertyValueCount; i++) // Loop over all objects in the Collection 
{ 
    object properyValueObject = (object)myObject.GetType().GetMethod("get_Item").Invoke(myObject, new object[] { i }); // Get the specified object out of the Collection, in this case a Field object 
    // Add the object to a collection of objects, or whatever you want to do with object 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^