By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,222 Members | 1,436 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 458,222 IT Pros & Developers. It's quick & easy.

How to fill a generics List with reflection?

P: n/a
Say I have a class that has a generics List as follows:

public List<MyClassmyClassList = new List<MyClass>();

and I want to create another class which tries to add an element of MyClass
to that list, but it is not explicitly creating an instance of MyClass, but
instead using the Activator to create an instance based on it's type name.

How can I accomplish this in C# using reflection?

Jun 27 '08 #1
Share this Question
Share on Google+
7 Replies


P: n/a
On May 13, 2:30*pm, MrNobody <MrNob...@discussions.microsoft.com>
wrote:
Say I have a class that has a generics List as follows:

public List<MyClassmyClassList = new List<MyClass>();

and I want to create another class which tries to add an element of MyClass
to that list, but it is not explicitly creating an instance of MyClass, but
instead using the Activator to *create an instance based on it's type name.

How can I accomplish this in C# using reflection?
I don't see where is the problem, you can invoke your Add either by
reflection or simply casting the instance resulting of using Activator
to the correct type.
Or you can use Activator to create an instance of MyClass and then use
InvokeMember with the created instance
Jun 27 '08 #2

P: n/a
On Tue, 13 May 2008 11:30:00 -0700, MrNobody
<Mr******@discussions.microsoft.comwrote:
Say I have a class that has a generics List as follows:

public List<MyClassmyClassList = new List<MyClass>();

and I want to create another class which tries to add an element of
MyClass
to that list, but it is not explicitly creating an instance of MyClass,
but
instead using the Activator to create an instance based on it's type
name.

How can I accomplish this in C# using reflection?
Well, you said you're already using Activator. So isn't that using
reflection?

Once you've got an instance of MyClass, it doesn't matter how you got it..
You can add it to a List<MyClasswhether you used "new" or Activator.
So, if you're having problems adding the instance to your list, it's
because you're not creating the type you apparently think you are.

You should post a concise-but-complete code sample that demonstrates the
problem you're having. Make sure you're specific about what fails.

Pete
Jun 27 '08 #3

P: n/a


"Peter Duniho" wrote:
>
You should post a concise-but-complete code sample that demonstrates the
problem you're having. Make sure you're specific about what fails.

Pete
Ok, here is a good test case to demonstrate what I am talking about:

public class MainClass
{
public void Test()
{
ParentClass parent = new ParentClass();
Console.WriteLine(parent.myClassList.Count + " items");

Type listType = Type.GetType("Tools.MyClass");
List<listTypelist = parent.GetType().GetField("myClassList");
// the type or namespace name 'listType' could not be found
list.Add(Activator.CreateInstance(listType)); // compiler error:
cannot convert form object to 'listType'

Console.WriteLine(parent.myClassList.Count + " items");

}
}

public class ParentClass
{
public List<MyClassmyClassList = new List<MyClass>();
}

public class MyClass
{
public string testString = "";
}

See how do I make a generic reference of that List? I think in Java you can
do something like List<?so you dont need to explicitly specify type but I
cant figure out how to do it in C#.

See I need to get a reference to that List using reflection without
explicitly specifying it's type, since it's type could be anything. Then I
need to add a new instance of that type to the list, again without explicitly
specifying it's type.

It has to be completely dynamic so that I can create an instance of a user
specified type and Add it to a List of that type.
Jun 27 '08 #4

P: n/a
On Tue, 13 May 2008 12:39:01 -0700, MrNobody
<Mr******@discussions.microsoft.comwrote:
[...]
See how do I make a generic reference of that List? I think in Java you
can
do something like List<?so you dont need to explicitly specify type
but I
cant figure out how to do it in C#.
I don't think you can do this in Java either. "List<?>" is sort of like
"List<T>" in C# where T is a type parameter, but in either case it's a
compile-time thing used to declare a generic. When you _use_ a generic,
there has to be a real type there.

Do you really need your collection to be in a List<T>? Again, since the
main benefit of generics is a compile-time thing, if you don't know the
type at compile time, it's not clear why you want to use List<T>.

In this particular example, I would just use an ArrayList, which is an
untyped collection that otherwise behaves similar to List<T>.

If you think that you really need a List<There, it would be helpful if
you could elaborate on that, including presenting a code example that
actually demonstrates that requirement. To do what you're asking
literally I believe would at a minimum require using reflection again,
instantiating the specific List<Tusing Activator or similar, and then
using reflection to invoke the appropriate Add() method.

But it seems to me that there's a strong likelihood that there's not
really a literal need to use List<T>. If you can provide a better
question, it's like you'll get a better answer, including an explanation
of an alternative approach that doesn't require reflection at all for the
collection itself.

Pete
Jun 27 '08 #5

P: n/a
MrNobody wrote:
See how do I make a generic reference of that List? I think in Java you can
do something like List<?so you dont need to explicitly specify type but I
cant figure out how to do it in C#.
List<T>. From your description I don't even think you need reflection.

Something like:

private void AddNewTolist<T>(List<TtoList)
{
if (toList != null)
toList.Add(new T());
}

Maybe I'm wrong, I don't have access to VS atm.

Chris.
Jun 27 '08 #6

P: n/a
Generics:

public void Test()
{
ParentClass parent = new ParentClass();
Console.WriteLine(parent.myClassList.Count + " items");
Foo(parent.myClassList);
Console.WriteLine(parent.myClassList.Count + " items");
}
public void Foo<T>(List<Tlist) where T : new() {
list.Add(new T());
}

Marc
Jun 27 '08 #7

P: n/a
MrNobody <Mr******@discussions.microsoft.comwrote:
You should post a concise-but-complete code sample that demonstrates the
problem you're having. Make sure you're specific about what fails.

Ok, here is a good test case to demonstrate what I am talking about:
<snip>

Looks to me like ParentClass should be generic, at which point half the
problems go away.

Most of the point of generics is to give *compile-time* type safety. If
you're not going to get that benefit, you'll probably find it's easier
just to use ArrayList rather than messing around with reflection.

--
Jon Skeet - <sk***@pobox.com>
Web site: http://www.pobox.com/~skeet
Blog: http://www.msmvps.com/jon.skeet
C# in Depth: http://csharpindepth.com
Jun 27 '08 #8

This discussion thread is closed

Replies have been disabled for this discussion.