开发者

A generic list of generics

开发者 https://www.devze.com 2022-12-27 19:23 出处:网络
I\'m trying to store a list of generic objects in a generic list, but I\'m having difficulty declaring it. My object looks like:

I'm trying to store a list of generic objects in a generic list, but I'm having difficulty declaring it. My object looks like:

public class Field<T>
{
    public string Name { get; set; }
    public string Description { get; set; }
    public T Value { get; set; }

    /*
    ...
    */
}

I'd like to create a list of these. My problem is that each object in the list can have a separate type, so that the populated list could contain something like this:

{开发者_StackOverflow中文版 Field<DateTime>, Field<int>, Field<double>, Field<DateTime> }

So how do I declare that?

List<Field<?>>

(I'd like to stay as typesafe as possible, so I don't want to use an ArrayList).


This is situation where it may benefit you to have an abstract base class (or interface) containing the non-generic bits:

public abstract class Field
{
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Field<T> : Field
{    
    public T Value { get; set; }

    /*
    ...
    */
}

Then you can have a List<Field>. That expresses all the information you actually know about the list. You don't know the types of the fields' values, as they can vary from one field to another.


You can't declare a list of generic types without knowing the generic type at compile time.

You can declare a List<Field<int>> or a List<Field<double>>, but there is no other common base type for Field<int> and Field<double> than object. So the only List<T> that could hold different kinds of fields would be List<object>.

If you want a more specific type for the list, you would have to make the Field<T> class inherit a class or implement an interface. Then you can use that for the generic type in the list.


Perhaps implement an interface.

interface IField
{
}

class Field<T> : IField
{
}

...

List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };
0

精彩评论

暂无评论...
验证码 换一张
取 消