This method creates an instance of a generic type on the ComValue structure by allowing you to specify a generic type name, the generic type parameters (as a ComArray) and optional constructor parameters (as a ComArray.)
o.ComValue.SetValueFromCreateGenericInstance(lcGenericType,loTypes,loParms)
Return Value
nothing
Parameters
lcGenericType
The generic type to access without the brackets and generic type names.
Example: System.Collections.Generic.List
loTypes
A ComArray of string values that name the generic type parameters. This is the type T definition in List<T>
or an implementation like List<string>
for example where the generic parameter would be System.String
.
Types need to be always fully qualified (ie System.String
,MyApp.MyClass
).
loParms
Values: NULL or ComArray of Parameters
An optional list of constructor parameters for the generic type. If no parameters are passed pass .NULL.
For any parameters pass a ComArray
with one item for each parameter.
Remarks
Generic Types are inaccessible directly from FoxPro
Generic types cannot be accessed directly in FoxPro - any attempt to access a generic type directly will likely cause FoxPro to crash. Always use intermediate methods like
InvokeMethod()
,GetProperty()
andSetProperty()
or aComValue
structure to interact with any generic types or values.
Example
CLEAR
do wwDotNetBridge
LOCAL loBridge as wwDotNetBridge
loBridge = GetwwDotnetBridge()
*** We'll build a value of: List<TestCustomer>
*** This is the generic type we want to create for list items
lcGenericItemType = "Westwind.WebConnection.TestCustomer"
*** We need a ComArray of strings, to hold the Generic Type Name(s)
loGenericTypes = loBridge.Createarray("System.String")
loGenericTypes.Add(lcGenericItemType)
*** As of 8.0.1 you can pass NULL if there are no parameters
*** Use this is possible as this makes i
* loParameters = null
*** Optional CTOR Parameters - CANNOT BE NULL prior to v8.0.1 (or method won't resolve via Reflection)
loParameters = loBridge.CreateArray("System.Object") && Empty CTOR parameter list
*** Most .NET objects don't have CTOR parameters so you can skip code up to the loValue= block
*** But if you want to specify CTOR parameters you can. You need a ComArray and add each
*** each parameter as an item. Here we pre-initialize the List from an array
*** which is one of the List<T> parameter options: List<T>(IEnumerable items) - (array is IEnumerable)
*** Create an array of items to initialize with
loItems = loBridge.CreateArray(lcGenericItemType)
*** Add individual items to the array
loCust = loBridge.CreateInstance(lcGenericItemType)
loCust.Name = "Rick 1"
loItems.Add(loCust)
loCust = loBridge.CreateInstance(lcGenericItemType)
loCust.Name = "Janet 1"
loItems.Add(loCust)
*** Now use the item list as the one parameter for the List CTOR
loParameters.Add(loItems)
*** Create our ComValue (use with InvokeMethod or SetProperty)
loValue = loBridge.CreateComValue()
*** Create the list instance
loValue.SetValueFromCreateGenericInstance("System.Collections.Generic.List",
loGenericTypes, loParameters)
*** Now add items - first get a COMARRAY list
loList = loValue.GetValue()
*** Create instances and add
loCust = loBridge.CreateInstance(lcGenericItemType)
loCust.Name = "Rick"
loList.Add(loCust)
loCust = loBridge.CreateInstance(lcGenericItemType)
loCust.Name = "Janet"
loList.Add(loCust)
*** List of the ComValue reflects added items
? loBridge.ToJson(loValue,.T.) && should show 4 items
See also:
Class ComValue© West Wind Technologies, 2024 • Updated: 08/26/24
Comment or report problem with topic