Considera la seguente classe generica:
public class EntityChangeInfo<EntityType,TEntityKey>
{
ChangeTypeEnum ChangeType {get;}
TEntityKeyType EntityKey {get;}
}
Qui EntityType
definisce univocamente TEntityKeyType
.
Quindi sarebbe bello avere un tipo di mappa dei tipi:
public class EntityChangeInfo<EntityType,TEntityKey> with map
< [ EntityType : Person -> TEntityKeyType : int]
[ EntityType : Car -> TEntityKeyType : CarIdType ]>
{
ChangeTypeEnum ChangeType {get;}
TEntityKeyType EntityKey {get;}
}
Un altro esempio è:
public class Foo<TIn> with map
< [TIn : Person -> TOut1 : string, TOut2 : int, ..., TOutN : double ]
[TIn : Car -> TOut1 : int, TOut2 :int, ..., TOutN : Price ] >
{
TOut1 Prop1 {get;set;}
TOut2 Prop2 {get;set;}
...
TOutN PropN {get;set;}
}
La domanda ragionevole: come può essere interpretata dal compilatore? Bene, per me è solo la scorciatoia per due classi strutturalmente simili:
public sealed class Foo<Person>
{
string Prop1 {get;set;}
int Prop2 {get;set;}
...
double PropN {get;set;}
}
public sealed class Foo<Car>
{
int Prop1 {get;set;}
int Prop2 {get;set;}
...
Price PropN {get;set;}
}
Ma oltre a questo potremmo visualizzare alcuni aggiornamenti di Foo<>
:
public class Foo<TIn> with map
< [TIn : Person -> TOut1 : string, TOut2 : int, ..., TOutN : double ]
[TIn : Car -> TOut1 : int, TOut2 :int, ..., TOutN : Price ] >
{
TOut1 Prop1 {get;set;}
TOut2 Prop2 {get;set;}
...
TOutN PropN {get;set;}
public override string ToString()
{
return string.Format("prop1={0}, prop2={1},...propN={N-1},
Prop1, Prop2,...,PropN);
}
}
Tutto ciò può sembrare abbastanza superficiale, ma l'idea è venuta quando stavo progettando i messaggi per il nostro sistema. La prima classe. Molti messaggi con la stessa struttura dovrebbero essere discriminati da EntityType
.
Quindi la domanda è se tale costrutto esiste in qualsiasi linguaggio di programmazione?