Class-based property access

References a property of a class in order to read or write its value.

Syntax

[ [ class-type-name | object-reference ] : ] 
  property-name [ [ index | key ] ]
class-type-name
The name of an ABL or .NET object type that defines the specified property as a static member. The use of class-type-name to access a static property is optional when you access the property from within the class hierarchy where it is defined. For more information, see the notes for this reference entry. You cannot use class-type-name to access an instance property. For more information on specifying object type names, see the Type-name syntax reference entry. You can use the unqualified class name with the presence of an appropriate USING statement.
object-reference
Specifies a reference to an instance of an ABL or .NET class (an object) that defines the specified property as an instance member. The use of object-reference to access an instance property is optional when you access the property from within the class hierarchy where it is defined. For more information, see the notes for this reference entry. You cannot use object-reference to access a static property. For information on specifying object references, see the reference entry for a Class-based object reference.
property-name
The name of an ABL or .NET property. Accessing a property is similar to accessing a variable data member. Also, like a data member, a property is defined in, and at, the level of a class definition. If it is an instance property, a separate copy exists for each instance of its defining class, for as long as the class instance exists. If it is a static property, only one copy exists for the defining class type during the entire ABL session, regardless if any instance of the class exists. A property is available inside or outside of the class hierarchy depending on its access mode. If and how a property can be read or written depends on a combination of its access mode and associated behavior defined for the property. For more information on ABL property definitions, see the DEFINE PROPERTY statement reference entry. For information on the definition of a .NET property, see its entry in Microsoft .NET, Infragistics, or another class library that defines it.
[ index|key ]
An index specifies an index into an ABL array property. A key specifies an indexer for a .NET indexed property. The brackets are a required part of the syntax.

If an array index is specified, it can be an integer value that identifies an element of an ABL array property, similar to an element of an ABL array data member (see the Class-based data member access reference entry).

If a key for a .NET property indexer is specified, it can be a value of any supported .NET data type that identifies the property value to reference. A .NET indexed property represents a group of properties, where the key is a value that indicates what member of the group is being referenced. A .NET indexed property can have more than one type of indexer that is overloaded according to the data type of its key, similar to a method that is overloaded by a single parameter. However, you cannot specify an AS data type with the key in order to identify a particular .NET indexer overload, as you can with a .NET method parameter (see the Parameter passing syntax reference entry). Also, some .NET indexed properties have indexers with multiple key values, each with its own data type. However, ABL only supports .NET indexed properties that have single-key indexers. So, you might be able to use some indexers for a property and not be able to use others.

Thus, ABL only recognizes a .NET property indexer if the property has a single-key indexer. If so, ABL selects the indexer using the ABL data type that you specify for the key, in order by the following criteria:

  1. If the .NET data type of an indexer key is the default match for the specified ABL data type, ABL uses that key.
  2. If there is no .NET indexer key that is a default match for the specified ABL data type, ABL uses the first key that it encounters where the .NET data type is an implicit data type mapping for the specified ABL data type.

For more information on how ABL data types map to .NET data types, see the Data types reference entry.

For example, if you specify an ABL INTEGER value for the key, and the indexer is overloaded by .NET System.Double, System.Byte, and System.Int32 keys, ABL uses the System.Int32key to index the property. If the available overloadings are System.Double, System.Byte, and System.Int16, ABL uses either the System.Byte or the System.Int16key, which ever is encountered first.

ABL classes do not currently support the definition of indexed properties. So, you cannot access ABL properties using an indexer.

Examples

The following code fragment shows a reference to a public instance property (HighCustBalance) on an instance of the sample class, r-CustObj:

DEFINE VARIABLE rObj AS CLASS r-CustObj NO-UNDO.
rObj = NEW r-CustObj( ) NO-ERROR.

MESSAGE "High customer balance =" rObj:HighCustBalance 
  VIEW-AS ALERT-BOX.

Once initialized, this instance property returns the highest balance for all Customer records in the sports2000 database.

The following code fragment shows a reference to a public static property (HighCustBalance) on the sample class type, r-CustObjStatic:

MESSAGE "High customer balance =" r-CustObjStatic:HighCustBalance 
  VIEW-AS ALERT-BOX.

This static property similarly returns the highest balance for all Customer records in the sports2000 database without having to instantiate the class, as in the previous instance code.

For more information on these properties and the sample classes in which they are defined, see the examples in the CLASS statement reference entry.

Notes

See also

Class-based data member access, Class-based object reference, DEFINE PROPERTY statement, Type-name syntax