473,387 Members | 1,572 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

How to fill a generics List with reflection?

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
7 6298
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
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


"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
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
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
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
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Marc | last post by:
Given a class 'Invoice' with a property 'public IMyColl<IInvoiceLine> InvoiceLines' where 'IMyColl<T> : IList<T>' i would like to detect by reflection that 'InvoiceLines' is a...
4
by: Gazarsgo | last post by:
This seems to be a bit of a contradiction, but how can I construct a Generic class using a System.Type variable that is assigned at run time? Is there some parallel to the Generics concept that...
1
by: uttara | last post by:
I have a generic collection which I am using in classes to store a collection of embedded objects. Class Employee: IEntity { Private string mName; Private int mEmployeeID; …. Private...
0
by: Konrad Kaczanowski | last post by:
Hi all, I'm creating code generator for wrappers of some c# classes. With the introduction of c# 2.0 and generics the following problem arises. When encountering generic types anywhere inside the...
9
by: sloan | last post by:
I'm not the sharpest knife in the drawer, but not a dummy either. I'm looking for a good book which goes over Generics in great detail. and to have as a reference book on my shelf. Personal...
4
by: cmay | last post by:
Is this something you are not allowed to do? I basically want to create an instance of a generic class where the type T is not know at compile time. e.g. dim s as System.Type = GetMyType()...
4
by: Cedric Rogers | last post by:
I wasn't sure if I could do this. I believe I am stretching the capability of what generics can do for me but here goes. I have a generic delegate defined as public delegate bool...
7
by: Ajeet | last post by:
hi I am having some difficulty in casting using generics. These are the classes. public interface IProvider<PROF> where PROF : IProviderProfile { //Some properties/methods }
4
by: =?Utf-8?B?SGF5U2VlZA==?= | last post by:
Is there some way to use Generics in dynamic code using the Type.GetType("MyClassName") as an argument? List<Type.GetType("MyClassName") oList = new List<Type.GetType("MyClassName") > ...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.