Accessing Private Fields from Outside
Robert Jacques
sandford at jhu.edu
Tue May 17 17:52:02 PDT 2011
On Tue, 17 May 2011 20:44:24 -0400, Mehrdad <wfunction at hotmail.com> wrote:
> On 5/17/2011 5:13 PM, Robert Jacques wrote:
>> On Tue, 17 May 2011 19:47:29 -0400, Mehrdad <wfunction at hotmail.com>
>> wrote:
>>
>>> Is there any (hacky) way of accessing a private field from outside a
>>> data type? (The equivalent of reflection in managed languages.)
>>>
>>> I'm trying to write a piece of marshaling code that needs access to a
>>> data type's fields, but can't access them because it's not allowed to.
>>> :(
>>
>> The short answer:
>> T.tupleof works for anything that you have the source to, but doesn't
>> support polymorphism out of the box.
>>
>> The long answer (from my json library):
>> static Value from(T)(T value) {
>> static if(is(T == class) ) if( value is null ) return
>> Value(Null.init);
>> //...
>> static if(is(T == struct) || is(T == class)) {
>> Value[string] result;
>> foreach(i,v;value.tupleof) {
>> result[value.tupleof[i].stringof["value.".length..$]]
>> = from(v);
>> }
>> return Value( result );
>> }
>> //..
>> }
>>
>> P.S. Are you marshaling to/from an open format or something proprietary?
> T.tupleof has a problem though: It doesn't seem to let me actually
> access the value; it just give me a tuple I can't do anything with. Your
> example only gets the name of the field, but you never actually seem to
> access it.
>
> (P.S.: I'm trying to marshal from/to Windows data structures, so I guess
> it's kinda both?)
I actually do both (name and value) in the above example.
Name: value.tupleof[i].stringof["value.".length..$]
Value: v
You can also use value.tupleof[i] if all you want is to set a field.
More information about the Digitalmars-d
mailing list