Ik heb een Func<T, object> property. Tijdens runtime wordt er aan deze property een waarde toegekend, oftewel een bepaalde functie die een "T" als input heeft en een "object" teruggeeft. De rede voor "object" is dat het elk type object kan zijn (string, int, whatever).
Dit systeem werkt al een tijd super, maar nu wil ik graag een stapje verder. Nu wil ik het daadwerkelijke type van "object" weten. Tijdens runtime uiteraard want daar is het type pas bekend.
De Func zit in een class als volgt:
Tijdens runtime ken ik waardes toe aan een lijstje van deze DataBinding objecten:
'data' is de input. Type van 'data' ("SomeDataInputType") is niet relevant maar deze heeft verschillende properties, in dit voorbeeld Name, Value1, Value2 en Color. De types van deze properties zijn aangegeven.
Op het moment dat GetDataFunc een waarde krijgt zou het volgens mij in theorie mogelijk moeten zijn om te achterhalen welk type het "object" echt is. Dus ik wil graag, op volgorde van bovenstaade code, de types "string", "int", "double" en "Color" vinden.
Ik krijg het echter niet voor elkaar. Als ik een breakpoint zet in de setter en kijk wat de nieuwe "_getDataFunc" is dan zie ik nergens het daadwerkelijke type. Enkel "Object" als return type. Op dit moment heeft de Func toch een waarde en zou het toch mogelijk moeten zijn voor de runtime om te achterhalen welke waarde dit is?
Als het met reflection moet dan is dat vast ok, deze code wordt enkel een keer bij startup gebruikt dus een kleine performance hit is geen probleem.
Weet iemand de oplossing?
Dit systeem werkt al een tijd super, maar nu wil ik graag een stapje verder. Nu wil ik het daadwerkelijke type van "object" weten. Tijdens runtime uiteraard want daar is het type pas bekend.
De Func zit in een class als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| public abstract class DataBindingBase { public Type Type {get;set;} } public class DataBinding<T> : DataBindingBase { private Func<T, object> _getDataFunc; public Func<T, object> GetDataFunc { get { return _getDataFunc; } set { _getDataFunc = value; // Get actual type from Func<T, object>? Type = ???? } } } |
Tijdens runtime ken ik waardes toe aan een lijstje van deze DataBinding objecten:
C#:
1
2
3
4
5
6
| Dictionary<string, DataBinding<SomeDataInputType>> binders = ... binders["name"].GetDataFunc = data => data.Name; // Type: string binders["value1"].GetDataFunc = data => data.Value1; // Type: int binders["value1"].GetDataFunc = data => data.Value2; // Type: double binders["color"].GetDataFunc = data => data.Object.Color; // Type: Color |
'data' is de input. Type van 'data' ("SomeDataInputType") is niet relevant maar deze heeft verschillende properties, in dit voorbeeld Name, Value1, Value2 en Color. De types van deze properties zijn aangegeven.
Op het moment dat GetDataFunc een waarde krijgt zou het volgens mij in theorie mogelijk moeten zijn om te achterhalen welk type het "object" echt is. Dus ik wil graag, op volgorde van bovenstaade code, de types "string", "int", "double" en "Color" vinden.
Ik krijg het echter niet voor elkaar. Als ik een breakpoint zet in de setter en kijk wat de nieuwe "_getDataFunc" is dan zie ik nergens het daadwerkelijke type. Enkel "Object" als return type. Op dit moment heeft de Func toch een waarde en zou het toch mogelijk moeten zijn voor de runtime om te achterhalen welke waarde dit is?
Als het met reflection moet dan is dat vast ok, deze code wordt enkel een keer bij startup gebruikt dus een kleine performance hit is geen probleem.
Weet iemand de oplossing?