C # - Πολλαπλές γενικούς τύπους σε ένα κατάλογο

ψήφοι
110

Αυτό είναι πιθανόν να μην είναι δυνατή, αλλά έχω αυτή την κατηγορία:

public class Metadata<DataType> where DataType : struct
{
    private DataType mDataType;
}

Υπάρχει περισσότερο σε αυτό, αλλά ας το κρατήσουμε απλό. Ο γενικός τύπος (Τύπος δεδομένων) περιορίζεται σε είδη αξίας από τη δήλωση πού. Αυτό που θέλω να κάνω είναι να έχουμε μια λίστα με αυτά τα μεταδεδομένα αντικείμενα διαφόρων τύπων (Τύπος δεδομένων). Οπως:

List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());

Είναι αυτό ακόμη δυνατό;

Δημοσιεύθηκε 09/12/2008 στις 16:29
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
142

public abstract class Metadata
{
}

// extend abstract Metadata class
public class Metadata<DataType> : Metadata where DataType : struct
{
    private DataType mDataType;
}
Απαντήθηκε 09/12/2008 στις 16:31
πηγή χρήστη

ψήφοι
72

Μετά την απάντηση leppie του, γιατί να μην κάνει MetaDataμια διεπαφή:

public interface IMetaData { }

public class Metadata<DataType> : IMetaData where DataType : struct
{
    private DataType mDataType;
}
Απαντήθηκε 09/12/2008 στις 16:41
πηγή χρήστη

ψήφοι
25

Έχω χρησιμοποιήσει επίσης μη γενική έκδοση, χρησιμοποιώντας τη newλέξη-κλειδί:

public interface IMetadata
{
    Type DataType { get; }

    object Data { get; }
}

public interface IMetadata<TData> : IMetadata
{
    new TData Data { get; }
}

Εφαρμογή ρητή διασύνδεση χρησιμοποιείται για να επιτρέψει τα δύο Dataμέλη:

public class Metadata<TData> : IMetadata<TData>
{
    public Metadata(TData data)
    {
       Data = data;
    }

    public Type DataType
    {
        get { return typeof(TData); }
    }

    object IMetadata.Data
    {
        get { return Data; }
    }

    public TData Data { get; private set; }
}

Θα μπορούσε να αντλήσει μια έκδοση που στοχεύουν είδη αξίας:

public interface IValueTypeMetadata : IMetadata
{

}

public interface IValueTypeMetadata<TData> : IMetadata<TData>, IValueTypeMetadata where TData : struct
{

}

public class ValueTypeMetadata<TData> : Metadata<TData>, IValueTypeMetadata<TData> where TData : struct
{
    public ValueTypeMetadata(TData data) : base(data)
    {}
}

Αυτό μπορεί να επεκταθεί σε κάθε είδους γενική περιορισμούς.

Απαντήθηκε 09/12/2008 στις 17:14
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more