Toon posts:

[C#, .Net 2] Generics binnen generics, hoe?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als Delphi programmeur van huis uit heb ik vrij weinig moeite met C#, maar hier kom ik nu even niet uit... Ook niet na search op GoT, MSDN, Google, enz.

Het probleem is simpel: ik wil een lijst / collection / array / whatever bijhouden van objecten die van elk type (dat ik nodig heb) kunnen zijn. In Delphi zou ik dan een abstract base class maken, met afgeleiden voor elk type dat ik wil gebruiken, en dan een TList afgeleide waar ik die base class in kan proppen.
Maar vorige week kwam ik in aanraking met generics binnen C#, en dat leek me een ideale manier om 't op te lossen zonder al die base class afgeleiden.
Gesimplificeerd voorbeeld van wat ik in gedachten had:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyField<T>
{
  private string fieldName;
  
  public string FieldName
  {
    get { return fieldName; }
    set { fieldName = value; }
  }
  
  private T fieldValue;
  
  public T FieldValue
  {
    get { return fieldValue; }
    set { fieldValue = value; }
  }
}

public class MyFieldList : List<MyField<T>>
{
}

Leuk geprobeerd, maar de compiler meldt op de MyFieldList definitie dat 'ie niet weet wat 'T' is en of ik misschien een reference mis. Idem wanneer ik iets als MyField<T>[] probeer te gebruiken.
Die MyField instances in een List<Object> proppen werkt natuurlijk wel, maar dan blijf je casten als je ook nog 's wat met dat MyField object wilt doen, zelfs als je via reflection uitvogelt wat voor object er nou echt in dat <Object> zit.

Voor mijn gevoel zou dit probleem goed met generics opgelost moeten kunnen worden, maar ik ben nu al een halve dag aan het zoeken hoe...

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ofwel doe je

C#:
1
2
public class MyFieldList<T> : List<MyField<T>>
{}


C#:
1
2
public class MyFieldList : List<MyField<MyObject>>
{}


het eerste behoudt de generic parameter, de tweede geeft een implementatie voor een specifiek type.

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Sh*t! Zo simpel kan 't zijn! Natuurlijk moet MyFieldList zelf ook een generic type zijn.
En daar heb ik me vandaag echt een halve dag op blindgestaard...

Thanks, hiermee gaat 't lukken.

edit:
Gelukt! :)
Nu nog 'even' IComparable implementeren in MyField, denk ik, want de compiler is niet blij met m'n setter voor FieldValue:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  private T fieldValue; 
   
  public T FieldValue 
  { 
    get { return fieldValue; } 
    set 
    { 
      if (fieldValue != value)
      { 
        // signal somehow that this field is dirty...
        fieldValue = value; 
      }
    } 
  }

... Die vindt dan op de if-check dat T niet met T vergeleken kan worden.
Bummer... Nou ja, als 't met IComparable kan is 't prima, en anders zitten al die MyFields ook nog in een ander object (laten we 't MyRecord noemen), en weten ze ook dat ze daar in zitten. Dan is 't ook nog met een delegate op te lossen.

/me heeft net een week C# cursus achter de rug, met al wel wat voorkennis, maar in 't "eggie" kom je toch een hoop dingen tegen die tijdens de cursus niet naar boven kwamen... :)

[ Voor 72% gewijzigd door Verwijderd op 18-05-2006 22:05 ]