В соответствии с предложением @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, который для меня медленный. Но если это единственное решение, я его принимаю.
Теперь я знаю, что это не самый маленький пример кода. Сейчас я смотрю на некоторые другие решения проблемы.