/ / Casting обект като ObservationCollection <object> - c #, .net, observablecollection

Отдаване на обект като observableCollection <object> - c #, .net, observablecollection

Аз се опитвам да напиша метод, който получава всички ObservationCollections в viewModel и хвърля всеки като ObservableCollection<object>, Използвайки размисъл, аз бях в състояние да получи всеки ObservableCollection<T> като обект, но имам затруднения да хвърля този обект на един ObservableCollection<object>, Ето моя код досега:

var props = viewModel.GetType().GetProperties();

Type t = viewModel.GetType();

foreach (var prop in props)
{
if (prop.PropertyType.Name == "ObservableCollection`1")
{
Type type = prop.PropertyType;
var property = (t.GetProperty(prop.Name)).GetValue(viewModel);

// cast property as an ObservableCollection<object>
}
}

Някой знае ли как трябва да процедирам?

Отговори:

2 за отговор № 1

Лоша идея е да сравните името на типа с низ. За да се твърди, че това е така ObservableCollection, можете да използвате следното:

if (prop.PropertyType.IsGenericType &&
prop.PropertyType.GetGenericTypeDefinition() == typeof(ObservableCollection<>))

Стойността може да бъде извлечена и трансформирана като такава:

foreach (var prop in viewModel.GetType().GetProperties())
{
if (prop.PropertyType.IsGenericType &&
prop.PropertyType.GetGenericTypeDefinition() == typeof(ObservableCollection<>))
{
var values = (IEnumerable)prop.GetValue(viewModel);

// cast property as an ObservableCollection<object>
var collection = new ObservableCollection<object>(values.OfType<object>());
}
}

Ако искате да ги комбинирате в една колекция, можете да направите това:

var values = viewModel.GetType().GetProperties()
.Where(p => p.PropertyType.IsGenericType)
.Where(p => p.PropertyType.GetGenericTypeDefinition() == typeof(ObservableCollection<>))
.Select(p => (IEnumerable)p.GetValue(viewModel))
.SelectMany(e => e.OfType<object>());
var collection = new ObservableCollection<object>(values);

1 за отговор № 2

Отговорът на този въпрос е тук: https://stackoverflow.com/a/1198760/3179310

Но за да стане ясно за вашия случай:

if (prop.PropertyType.Name == "ObservableCollection`1")
{
Type type = prop.PropertyType;
var property = (t.GetProperty(prop.Name)).GetValue(viewModel);

// cast property as an ObservableCollection<object>
var col = new ObservalbeCollection<object>(property);
// if the example above fails you need to cast the property
// from "object" to an ObservableCollection<T> and then execute the code above
// to make it clear:
var mecol = new ObservableCollection<object>();
ICollection obscol = (ICollection)property;
for(int i = 0; i < obscol.Count; i++)
{
mecol.Add((object)obscol[i]);
}
// the example above can throw some exceptions but it should work in most cases
}

0 за отговор № 3

Можете да използвате Cast<T>() разширяване метод, но не забравяйте, като използвате товаметод (по-долу) това ще създаде нов инстанция, така че събитията от оригинала не работят. Ако все още искате да получавате събития, трябва да създадете обвивка около него.

var prop = viewModel.GetType("ObservableCollection`1");

var type = prop.PropertyType;
var propertyValue = (t.GetProperty(prop.Name)).GetValue(viewModel);

// cast property as an ObservableCollection<object>
var myCollection = new ObservableCollection<object>(
((ICollection)propertyValue).Cast<object>());

}