2010-11-22 3 views
0

Я имею немного проблемы с помощью отражения и доступа к коллекции:Переосмысление, коллекции, диктаторы Oh My!

XmlElement xmlObject = Scene.CreateElement("Object"); 
Type Target = obj.GetType(); 

... xml code here 

PropertyInfo[] props = Target.GetProperties(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static); 

foreach (PropertyInfo prop in props) 
{ 
Type propType = prop.PropertyType; 

if ((propType.IsPublic && propType.IsValueType && prop.CanRead && prop.CanWrite) 
    || PropertyNameExceptions.Contains(prop.Name) 
    || PropertyTypeExceptions.Contains(prop.PropertyType.Name)) 
{ 

    object result = null; 
    try 
    { 
    result = prop.GetValue(obj, null); 
    } 
    catch 
    { 

    } 
    } 

else if (isCollection(result)) 
{ 

    Type pType = result.GetType(); 
    PropertyInfo[] pTypeInfo = pType.GetProperties(); 

    ICollection<object> rCollection = null; 
    try 
    { 
    rCollection = (ICollection<object>)prop.GetValue(obj, null); 
    } 
    catch 
    { 

    } 

    foreach (object o in rCollection) 
    { 
    ObjectToXML(o, xmlPropertyObject); 
    } 
} 
} 

private bool isCollection(object o) 
{ 
if (o.GetType().GetInterface("ICollection") != null) 
{ 
return true; 
} 

return false; 
} 

Невозможно привести объект типа «ValueCollection [System.String, Axiom.Core.MovableObject]» к типу «System.Collections. Generic.ICollection`1 [System.Object]».

+1

Можете ли вы немного разобраться? Чего вы пытаетесь достичь, что делает ваш код и где именно вы получаете сообщение об ошибке? Люди с радостью помогут вам здесь, но, пожалуйста, не просто сбрасывайте код и сообщение об ошибке и ожидайте, что кто-то отлаживает его для вас ... – Heinzi 2010-11-22 14:31:03

ответ

2

Вы проверить, если не общая версия ICollection является implementend объектом и hapilly попытаться привести его к ICollection<Object> ...

либо испытание, если объект действительно реализовать ICollection<Object>:

private bool isCollection(object o) 
{ 
    return o is ICollection<object>; 
} 

или используйте что-то вроде

rCollection = ((IEnumerable)prop.GetValue(obj, null)).OfType<Object>().ToList(); 
Смежные вопросы