Как получить список <int>из System.Object, полученный отражением? - PullRequest
0 голосов
/ 20 октября 2019

В соответствии с предложением @John, здесь нужно переписать:

Рассмотрим этот код:

public object Foo(object original)
{
    List<object> origList = original as List<object>;    //problematic line, origList is null even though it was initialized as [1,2,3] in main method
    List<object> copy = new List<object>();

    foreach (var item in origList)
        copy.Add(item);

    return copy;
}

class Example
{
    List<int> someList = new List<int>() { 1,2,3 };
    // and also other Lists, I dont know their type at compile time
    // and other fields and methods
}

//in usage method:

Example e1 = new Example();
object obj1 = e1;    // this is original
Example e2 = new Example();
object obj2 = e2;   // this is copy

FieldInfo[] fields_of_class = obj1.GetType().GetFields(
            BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

foreach(FieldInfo fi in fields_of_class)
{
    object currentObject = fi.GetValue(obj1);

    // do type checking
    if (IsList(currentObject)
    {
        fi.SetValue(obj2, Foo(currentObject));    // here I have to retrive copy of the list, but I dont know generic argument beforehand as it can be List<insert any type here>
    }
}

Как я могу получить этот исходный список из System.Object в методе Foo?

Предпочтительно, я бы не хотел использовать универсальные методы, так как мне пришлось бы делать MakeGenericMethod, который для меня медленный. Но если это единственное решение, я его принимаю.

Теперь я знаю, что это не самый маленький пример кода. Сейчас я смотрю на некоторые другие решения проблемы.

1 Ответ

1 голос
/ 20 октября 2019

Вы можете попробовать это:

public object Foo(object original)
{
  if ( original is System.Collections.IEnumerable )
  {
    List<object> copy = new List<object>();

    foreach ( var item in original as System.Collections.IEnumerable )
      copy.Add(item);

    return copy;
  }
  else
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...