AbrahamJP AbrahamJP - 3 months ago 8
C# Question

Adding items to List<T> using reflection

I was trying to add items to IList through reflection, but while calling the "Add" method an error was thrown "object ref. not set". While debugging I came to know that the GetMethod("Add") was returning a NULL reference.

Type objTyp = typeof(MyObject); //HardCoded TypeName for demo purpose
var IListRef = typeof (List<>);
Type[] IListParam = {objTyp};
object Result = IListRef.MakeGenericType(IListParam);

MyObject objTemp = new MyObject();
Result.GetType().GetMethod("Add").Invoke(Result, new[] {objTemp });


Please help.

Answer

You're trying to find an Add method in Type, not in List<MyObject> - and then you're trying to invoke it on a Type.

MakeGenericType returns a type, not an instance of that type. If you want to create an instance, Activator.CreateInstance is usually the way to go. Try this:

Type objTyp = typeof(MyObject); //HardCoded TypeName for demo purpose
var IListRef = typeof (List<>);
Type[] IListParam = {objTyp};          
object Result = Activator.CreateInstance(IListRef.MakeGenericType(IListParam));

MyObject objTemp = new MyObject(); 
Result.GetType().GetMethod("Add").Invoke(Result, new[] {objTemp });

(I would also suggest that you start following conventions for variable names, but that's a separate matter.)