[fpc-pascal] Unrelated type helpers with the same members? Implement an interface with a type helper?

Ondrej Pokorny lazarus at kluug.net
Fri Dec 23 11:24:55 CET 2022


This may be simpler:

[TEnumAttr(['YES', 'NO', 'COULD_BE'])]
   TMyEnum = (meYes, meNo, meCouldBe);

TEnumAttr = class(TCustomAttribute)
   protected
     FValues: TStringArray;
     FTypeName: String;
   public
     class function FromType(ATypeInfo: PTypeInfo): TEnumAttr;
     constructor Create(Values: array of string);

---

Or, if the enum values are valid identifiers, you can simple use scoped 
enums:

{$SCOPEDENUMS ON}
   TMyEnum = (YES, NO, COULD_BE);

and the usual TypeInfo methods.

Ondrej


On 23.12.2022 06:35, Andrew Haines via fpc-pascal wrote:
> So, I came up with a solution using Custom Attributes.
>
> I can declare this:
>
> [TEnumAttr('YES', 'NO', 'COULD_BE')]
>   TMyEnum = (meYes, meNo, meCouldBe);
>
> and at runtime look for the TEnumAttr attribute and use that.
>
>
> TEnumAttr = class(TCustomAttribute)
>   protected
>     FValues: TStringArray;
>     FTypeName: String;
>   public
>     class function FromType(ATypeInfo: PTypeInfo): TEnumAttr;
>     constructor Create(Val1: String);
>     constructor Create(Val1, Val2: String);
>
> etc
>
> Maybe this can help someone else with a similar use case.
>
>
> Regards,
>
> Andrew Haines
>
> On 12/22/22 8:40 PM, Andrew Haines via fpc-pascal wrote:
>> Hi what I want to do is similar to this question here: 
>> https://en.delphipraxis.net/topic/423-rtti-determine-record-helper-type-for-a-base-type/
>>
>> I am going to create multiple type helpers for enums and I would like 
>> to look up the helper and use common methods AsString AsOrdinal to 
>> get/set the values. I am recieving them as json that I dont have 
>> control over. I am using typeinfo to fill in all the properties but I 
>> would like to convert the strings I am receiving to the enum values 
>> semi-automatically.
>>
>> LString := 'STATUS';
>>
>> LHelper := GetHelper(LPropInfo^.PropType); // enum proptype
>>
>> LToStringInterface := LHelper as IToStringInterface;
>>
>> SetOrdProp(LObject, 'propname', LToStringInterface.OrdValue(LString);
>>
>>
>> Something like that. I'm not sure if it's even possible to find the 
>> helper type with typeinfo.
>>
>> Thanks for your suggestions :)
>>
>> Regards,
>>
>> Andrew
>>
>> _______________________________________________
>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


More information about the fpc-pascal mailing list