简体   繁体   English

我如何投射到ObservableCollection中<object>

[英]How can i cast into a ObservableCollection<object>

How can i cast 我怎么能投

from ObservableCollection<TabItem> into ObservableCollection<object>

this doesnt work for me 这对我不起作用

(ObservableCollection<object>)myTabItemObservableCollection

你应该像这样复制

return new ObservableCollection<object>(myTabItemObservableCollection);

Basically, you can't. 基本上,你不能。 Not now, and not in .NET 4.0 . 不是现在,而不是在.NET 4.0中

What is the context here? 这里的背景是什么? What do you need? 你需要什么? LINQ has Cast<T> which can get you the data as a sequence , or there are some tricks with generic methods (ie Foo<T>(ObservalbleCollection<T> col) etc). LINQ具有Cast<T> ,可以将数据作为序列获取 ,或者有一些通用方法的技巧(即Foo<T>(ObservalbleCollection<T> col)等)。

Or you can just use the non-generic IList ? 或者您可以使用非通用IList

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

你可以使用IEnumerable.Cast<T>()

You can't. 你不能。 ObservableCollection<TabItem> does not derive from ObservableCollection<object> . ObservableCollection<TabItem>不是从ObservableCollection<object>派生的。

If you explain why you would want to perhaps we can point out an alternative interface you can use. 如果你解释为什么你想要,或许我们可以指出你可以使用的替代界面。

thanx for all answers, but I think I have solve this problem self with a "helpermethode". 感谢所有答案,但我认为我用“helpermethode”解决了这个问题。

Perhaps has any a better method or a linq statement for this. 或许对此有任何更好的方法或linq声明。

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

None of the examples I have found have worked for me, I have cobbled together the below code and it seems to work. 我找到的所有例子都没有为我工作,我拼凑了下面的代码,它似乎工作。 I have a hierarchy that is created by deserializing an XML file and I am able to loop through all the objects in the hierarchy, but you can adapt this to just loop through one ObservableCollection and get the objects as objects and not strongly typed. 我有一个通过反序列化XML文件创建的层次结构,我能够循环遍历层次结构中的所有对象,但是您可以将其调整为仅循环通过一个ObservableCollection并将对象作为对象而不是强类型。

I want to add a PropertyChangingEventHandler to every property in the hierarchy so that I can implement undo/redo functionality. 我想为层次结构中的每个属性添加一个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
                    }
                }
            }
        }
    }
}

The method is just called like this 这个方法就是这样调用的

TraversalHelper.TraverseAndExecute(object);

If you just want to create a collection of objects you just need this bit of code 如果你只想创建一个对象集合,你只需要这些代码

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
}

You can Cast it as INotifyCollectionChanged; 您可以将其转换为INotifyCollectionChanged;

Like: 喜欢:

if (myTabItemObservableCollection is INotifyCollectionChanged collection)
{
   Do Stuff
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM