2009-02-17 4 views
1

У меня есть простой код, который демонстрирует мою проблему:к Приведение к базовому типу родового объекта от System.Object

private void InitializeOther() 
{ 
    List<Foo> list = new List<Foo>(); 
    Casting(list); 
} 

//in the "real" case I have no knowledge of o, other than it could be a List<> 
private void Casting(object o) 
{ 
    Type t = o.GetType(); 
    while (t.BaseType != typeof(Object)) 
    { 
    if (t.IsGenericType && typeof(List<>) == t.GetGenericTypeDefinition()) 
    { 
     //now I know that o is of type List<>. How can I now access List<> members from o? 
     break; 
    } 
    t = t.BaseType; 
    } 
} 

Таким образом, я могу быть уверен, что объект О имеет (или производный) из List<T>, но теперь я хотите иметь доступ к List<T> членам на o, а это значит, что вы можете его отменить до List<Foo>. В моем «реальном» случае я не знаю Foo.

Я уверен, что это можно сделать, и если вы знаете, как это сделать, я был бы очень благодарен, если бы вы могли поделиться своими знаниями со мной!

ответ

0

Небольшой взломанный способ будет использовать o для не общего IList, так как List<T> реализует как общие, так и не общие интерфейсы. То же самое можно сказать о Collection<T>, который является наиболее используемым базовым классом для пользовательских коллекций.

Если это не вариант, вы всегда можете получить вместе со светоотражающими вызова метода (позднее связывание): MethodInfo.Invoke() и т.д.

+0

Хорошо, спасибо, вызов метода является то –

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