Welcome, Guest
Username: Password: Remember me
  • Page:
  • 1

TOPIC:

Object extensions 28 Nov 2016 15:22 #698

  • wriedmann
  • wriedmann's Avatar
  • Topic Author


  • Posts: 3245
  • Hello,

    I'm used from VO to write code that works dynamically. Therefore I have written several extension methods for the object class. Maybe this code helps someone:
    using System                        
    using System.Text
    using System.Runtime.InteropServices
    using System.Reflection 
    using System.Diagnostics
    using System.Collections.Generic
    
    begin namespace rdm.BaseLib
    
    class ObjectExtensions
    
    	constructor()  
    		super()
    	return
    
    static method IsMethod( self oObject as object, cMethod as string ) as logic
    	local oType as System.Type
    	local lReturn as logic
    	
    	if oObject == null_object
    		lReturn		:= false
    	else
    		oType 		:= oObject:GetType()
    		if oType:GetMethod( cMethod ) == null_object
    			lReturn		:= false
    		else
    			lReturn		:= true
    		endif
    	endif
    	
    	return lReturn
    
    static method Send( self oObject as object, cMethod as string, aParameters as object[] ) as object 
    	local oType as System.Type
    	local oReturn as object
    	local oInfo as MethodInfo
    	
    	oType 				:= oObject:GetType()
    	oReturn				:= null_object
    	oInfo				:= oType:GetMethod( cMethod )
    	if oInfo != null_object
    		oReturn				:= oInfo:Invoke( oObject, aParameters )
    	endif
    	
    	oType				:= null_object
    	oInfo				:= null_object
    	
    	return oReturn              
    	
    static method ClassName( self oObject as object ) as string 
    	local cReturn		as string
    	
    	cReturn				:= oObject:GetType():Name
    	
    	return cReturn	    
    	
    static method PropertyNames( self oObject as object ) as string[]
    	local aReturn		as string[]
    	local nLen			as int
    	local nI			as int       
    	local oProperties	as System.Reflection.PropertyInfo[]
                              
    	oProperties		:= oObject:GetType():GetProperties()	
    	nLen			:= oProperties:Length
    	aReturn			:= string[]{nLen}
    	for nI := 1 upto nLen
    		aReturn[nI]		:= oProperties[nI]:Name
    	next
    	oProperties		:= null_object
    		
    	return aReturn	
    	
    static method IsProperty( self oObject as object, cPropertyName as string ) as logic
    	local aProperties	as string[]
    	local lReturn		as logic
    	local nLen			as int
    	local nI			as int       
    	
    	aProperties		:= PropertyNames( oObject )
    	cPropertyName	:= cPropertyName:ToLower()
    	nLen			:= aProperties:Length
    	lReturn			:= false
    	for nI := 1 upto nLen
    		if aProperties[nI]:ToLower() == cPropertyName
    			lReturn			:= true
    			exit
    		endif
    	next
    	
    	return lReturn
    	
    static method FixPropertyName( self oObject as object, cPropertyName as string ) as string
    	local aProperties	as string[]
    	local cReturn		as string
    	local nLen			as int
    	local nI			as int       
    	
    	aProperties		:= PropertyNames( oObject )
    	cPropertyName	:= cPropertyName:ToLower()
    	nLen			:= aProperties:Length
    	cReturn			:= cPropertyName
    	for nI := 1 upto nLen
    		if aProperties[nI]:ToLower() == cPropertyName
    			cReturn			:= aProperties[nI]
    			exit
    		endif
    	next
    	
    	return cReturn
    
    static method GetPropertyValue( self oObject as object, cPropertyName as string ) as object
    // Attention: the property name must respect the correct case!!!!
    	local oReturn		as object	
    	local oInfo			as System.Reflection.PropertyInfo
    	
    	oInfo			:= oObject:GetType():GetProperty( cPropertyName ) 
    	if oInfo != null_object                                  
    		oReturn			:= oInfo:GetValue( oObject, null_object ) 
    	else
    		oReturn			:= null_object
    	endif
    	
    	return oReturn
    
    static method SetPropertyValue( self oObject as object, cPropertyName as string, oValue as object ) as void
    // Attention: the property name must respect the correct case!!!!
    	local oInfo			as System.Reflection.PropertyInfo
    	
    	oInfo			:= oObject:GetType():GetProperty( cPropertyName ) 
    	if oInfo != null_object
    		oInfo:SetValue( oObject, oValue, null_object )                        
    	endif
    	
    	return
    
    end class
    
    end namespace
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Last edit: by wriedmann.
    • Page:
    • 1