Domanda

Esiste un modo per raccogliere (ad es.in un elenco) più oggetti "generici" che non condividono una super classe comune?In tal caso, come posso accedere alle loro proprietà comuni?

Per esempio:

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

   public MyObject(string name, T value)
   {
      Name = name;
      Value = value;
   }
}

var fst = new MyObject<int>("fst", 42);
var snd = new MyObject<bool>("snd", true);

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd};

foreach (MyObject<?> o in list)
   Console.WriteLine(o.Name);

Ovviamente, questo è pseudo codice, non funziona.

Inoltre non ho bisogno di accedere alla proprietà .Value (poiché non sarebbe indipendente dai tipi).

MODIFICARE: Ora che ci ho pensato, sarebbe possibile utilizzare le sottoclassi per questo.Tuttavia, penso che ciò significherebbe che dovrei scrivere una nuova sottoclasse per ogni nuovo tipo.


@GrzenioSì, questo ha risposto esattamente alla mia domanda.Naturalmente ora devo duplicare l'intera interfaccia condivisa, ma non è un grosso problema.Avrei dovuto pensarci...

@akuHai ragione riguardo alla digitazione dell'anatra.Non mi aspetterei che due tipi di oggetti completamente casuali fossero accessibili.

Ma pensavo che gli oggetti generici avrebbero condiviso una sorta di interfaccia comune, poiché sono esattamente gli stessi, a parte il tipo con cui sono parametrizzati.A quanto pare, questo non è il caso automaticamente.

È stato utile?

Soluzione

Non penso che sia possibile in C#, perché MyObject non è una classe base di MyObject.Quello che faccio di solito è definire un'interfaccia (una "normale", non generica) e fare in modo che MyObject implementi quell'interfaccia, ad es.

interface INamedObject
{
    string Name {get;}
}

e poi puoi usare l'interfaccia:

List<INamedObject> list = new List<INamedObject>(){fst, snd};

foreach (INamedObject o in list)
   Console.WriteLine(o.Name);

Ha risposto alla tua domanda?

Altri suggerimenti

C# non supporta la digitazione duck.Hai 2 scelte:interfacce ed ereditarietà, altrimenti non è possibile accedere a proprietà simili di diversi tipi di oggetti.

Il modo migliore sarebbe aggiungere una classe base comune, altrimenti puoi ricorrere alla riflessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top