I have a class.
I need to write a routine in this class, that loop through it's members (in
a instance of the class) and concatenate all members values as string.
I need to filter does members with a custom attribute (found a way), so only
some of them are considered to be added to final string.
The hard part is that some members are class instances them selfs and the
same method should be called for them and the returning string should be
added to the final string
Make any sence to anybody? :)
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------ 16 1699
No one??
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------
"Crirus" <Cr****@datagroup.ro> wrote in message
news:%2******************@TK2MSFTNGP12.phx.gbl... I have a class. I need to write a routine in this class, that loop through it's members
(in a instance of the class) and concatenate all members values as string. I need to filter does members with a custom attribute (found a way), so
only some of them are considered to be added to final string.
The hard part is that some members are class instances them selfs and the same method should be called for them and the returning string should be added to the final string
Make any sence to anybody? :)
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
>>through it's members (in a instance of the class) <<
This bit is confusing...
"Crirus" <Cr****@datagroup.ro> wrote... I have a class. I need to write a routine in this class, that loop through it's members
(in a instance of the class) and concatenate all members values as string.
I'll suggest that you describe your ultimate goal... not what you need to
write but rather what you need to "do." It sounds a little like you are
looking for a serialization solution but who knows? What often happens is
that problems are posted which can easily be solved by not attacking if from
that direction.
Tom
Hi Crirus,
|| Make any sence to anybody? :)
It makes loads of sense (although I have questions).
I started to answer this about five minutes after you posted it and
got half way through. Then I decided it was too complicated. At the time
I was working on a routine for Bernie and I couldn't give both queries
attention at the same time - especially as the routine may have uncovered
a bug in ListBoxes and was driving me nuts!
What you're talking about is practically a do-it-yourself MemberwiseClone.
In principle it's easy - get a list of the members and copy them - but in practice
there are difficulties.
I've been working on something similar but perhaps more complex -
cloning a Control and all child Controls. It works but it's a work-in-progress
and the scaffolding of experimental, test and debug code is pretty big. It's also
in C# and wouldn't be much use to you as it stands.
So - to the questions.
Are these all your own classes?
Do any of them reference unmanaged resources (eg PictureBoxes)?
Do these classes raise events?
Do the object references all flow one way (ie. parent to child, child to
sub-child) or are there backward and sideways references (ie. child to
parent or child to sibling) ?
And can you tell me more about 'I need to filter those members with a
custom attribute (found a way)' ? Do you mean you <have> found a way
or you still need to <find> a way? (I saw that question elsewhere I think).
Regards,
Fergus
All classes are mine.
I'm looking for kind of serialisation.
My goal is to get a string containing all values from all graph tree where I
flagged the members.
I have a separator for each field concatenated...so, if a class have a
integer with value 124 marked for this serialisation
I whould espect to get "124"+tokenSeparator somewhere in the final string.
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------
"Fergus Cooney" <fi****@post.com> wrote in message
news:ec**************@TK2MSFTNGP12.phx.gbl... Hi Crirus,
|| Make any sence to anybody? :)
It makes loads of sense (although I have questions).
I started to answer this about five minutes after you posted it and got half way through. Then I decided it was too complicated. At the time I was working on a routine for Bernie and I couldn't give both queries attention at the same time - especially as the routine may have uncovered a bug in ListBoxes and was driving me nuts!
What you're talking about is practically a do-it-yourself
MemberwiseClone. In principle it's easy - get a list of the members and copy them - but in
practice there are difficulties.
I've been working on something similar but perhaps more complex - cloning a Control and all child Controls. It works but it's a
work-in-progress and the scaffolding of experimental, test and debug code is pretty big.
It's also in C# and wouldn't be much use to you as it stands.
So - to the questions.
Are these all your own classes? Do any of them reference unmanaged resources (eg PictureBoxes)? Do these classes raise events? Do the object references all flow one way (ie. parent to child, child
to sub-child) or are there backward and sideways references (ie. child to parent or child to sibling) ?
And can you tell me more about 'I need to filter those members with a custom attribute (found a way)' ? Do you mean you <have> found a way or you still need to <find> a way? (I saw that question elsewhere I
think). Regards, Fergus
Hi Crirus,
|| All classes are mine.
And the other questions? ;-)
And could you post a couple of your classes - just the
Fields and Properties, the methods don't matter for this.
Regards,
Fergus
>Are these all your own classes?
Yes Do any of them reference unmanaged resources (eg PictureBoxes)?
No, only standard data types or another classesDo these classes raise events?
Yes, but not related to serialisation I need
Do the object references all flow one way (ie. parent to child, child to
sub-child) or are there backward and sideways references (ie. child to
parent or child to sibling) ?
They may have cross references or to parent, but only the fields that are
referenced one way should be serialised as string as I said
The classes graph look kind of like this
Game>
Players()>
UnitGroups()>
Unit()>
There are another brances starting with Game but the same ideea....
Only from root object to last child I need serialisation, not child to child
or child to parent reference. That references are for functionlaity porposes
In fact, I need marked fields from every clas, only once..and if some fields
are, in fact another class, that class marked fields too...
That final string I want to send it to a client that can repopulate he's
class with values... the client classes are not as important as the server
ones, only for interface use
"Fergus Cooney" <fi****@post.com> wrote in message
news:Ox*************@TK2MSFTNGP11.phx.gbl... Hi Crirus,
|| All classes are mine.
And the other questions? ;-)
And could you post a couple of your classes - just the Fields and Properties, the methods don't matter for this.
Regards, Fergus
"Crirus" <Cr****@hotmail.com> wrote... Are these all your own classes? Yes
Aren't you describing serialization?
Kind of, but quite different one, because I need to deserialise in a
diferend graph, not hte same like the one I take values from...
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------
"Tom Leylan" <ge*@iamtiredofspam.com> wrote in message
news:b1*********************@twister.nyc.rr.com... "Crirus" <Cr****@hotmail.com> wrote...Are these all your own classes? Yes
Aren't you describing serialization?
I whould like some details here if you have some time...
The main goal I try to do it this way is because I dont want to write the
routine that serialise my members every time I modify the class...
Instead taking every member I'm interested in, I whould like to flag does
members and add them to the final string in a for loop.
And everytime that for loop have to deal with an instance of another class,
I whould like to call an equivalent method like this one in that class
I need this kind of serialisation, becasue I dont reload exactly the same
graph objects... I use values for a interface, in some smaller classes.
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------
"Jay B. Harlow [MVP - Outlook]" <Ja********@email.msn.com> wrote in message
news:%2******************@TK2MSFTNGP10.phx.gbl... Crirus, Seeing as you hinted at an Object Graph, I would recommend XML
Serialization followed by a XSLT transformation to get it in the format you are after.
I would recommend the XML formatter, over the SOAP formatter, as the SOAP formatter only serializes public properties.
Otherwise you are effectively writing your own serialization code. If you decide the XML Serialization is too heavy weight (which it is). I would consider using the System.ComponentModel.TypeDescriptor class to get type descriptors information for each class that you can then write loops over
to get values. Which will work for properties not fields... For fields you
will need to drop down to Reflection.
Hope this helps Jay
"Crirus" <Cr****@datagroup.ro> wrote in message news:%2******************@TK2MSFTNGP12.phx.gbl... I have a class. I need to write a routine in this class, that loop through it's members (in a instance of the class) and concatenate all members values as string. I need to filter does members with a custom attribute (found a way), so only some of them are considered to be added to final string.
The hard part is that some members are class instances them selfs and
the same method should be called for them and the returning string should be added to the final string
Make any sence to anybody? :)
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
Crirus,
Seeing as you hinted at an Object Graph, I would recommend XML Serialization
followed by a XSLT transformation to get it in the format you are after.
I would recommend the XML formatter, over the SOAP formatter, as the SOAP
formatter only serializes public properties.
Otherwise you are effectively writing your own serialization code. If you
decide the XML Serialization is too heavy weight (which it is). I would
consider using the System.ComponentModel.TypeDescriptor class to get type
descriptors information for each class that you can then write loops over to
get values. Which will work for properties not fields... For fields you will
need to drop down to Reflection.
Hope this helps
Jay
"Crirus" <Cr****@datagroup.ro> wrote in message
news:%2******************@TK2MSFTNGP12.phx.gbl... I have a class. I need to write a routine in this class, that loop through it's members
(in a instance of the class) and concatenate all members values as string. I need to filter does members with a custom attribute (found a way), so
only some of them are considered to be added to final string.
The hard part is that some members are class instances them selfs and the same method should be called for them and the returning string should be added to the final string
Make any sence to anybody? :)
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
Crirus, I whould like some details here if you have some time...
On which? I gave at least three ideas ;-)
In reference to your answer to Tom Lehlan, using XML Serialization you can
transform the XML document created by the serialization , such that
deserialization will create a different graph with different objects. I
don't have a specific example handy.
Thanks
Jay
"Crirus" <Cr****@datagroup.ro> wrote in message
news:eC**************@TK2MSFTNGP09.phx.gbl... I whould like some details here if you have some time...
The main goal I try to do it this way is because I dont want to write the routine that serialise my members every time I modify the class... Instead taking every member I'm interested in, I whould like to flag does members and add them to the final string in a for loop. And everytime that for loop have to deal with an instance of another
class, I whould like to call an equivalent method like this one in that class I need this kind of serialisation, becasue I dont reload exactly the same graph objects... I use values for a interface, in some smaller classes.
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
"Jay B. Harlow [MVP - Outlook]" <Ja********@email.msn.com> wrote in
message news:%2******************@TK2MSFTNGP10.phx.gbl... Crirus, Seeing as you hinted at an Object Graph, I would recommend XML Serialization followed by a XSLT transformation to get it in the format you are after.
I would recommend the XML formatter, over the SOAP formatter, as the
SOAP formatter only serializes public properties.
Otherwise you are effectively writing your own serialization code. If
you decide the XML Serialization is too heavy weight (which it is). I would consider using the System.ComponentModel.TypeDescriptor class to get
type descriptors information for each class that you can then write loops
over to get values. Which will work for properties not fields... For fields you will need to drop down to Reflection.
Hope this helps Jay
"Crirus" <Cr****@datagroup.ro> wrote in message news:%2******************@TK2MSFTNGP12.phx.gbl... I have a class. I need to write a routine in this class, that loop through it's
members (in a instance of the class) and concatenate all members values as string. I need to filter does members with a custom attribute (found a way),
so only some of them are considered to be added to final string.
The hard part is that some members are class instances them selfs and the same method should be called for them and the returning string should
be added to the final string
Make any sence to anybody? :)
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
Well, My goal is to get minimum information because I need to minimise
trafic as much as possible..so I dont need any xml in the final string
On the deserialisation side, I whould have some parser that know what to
espect and how to deal with it..
so if espect a player data, parser knows how many fields a player have and
load a clientside player class with all data's. After player data, can
follow another data about something else...so, the parser create that object
and load from string data it need and so one
That's why I need only a loop through all members of every class that are
flaged anf just append a ToString to the final string...
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------
"Jay B. Harlow [MVP - Outlook]" <Ja********@email.msn.com> wrote in message
news:u4**************@TK2MSFTNGP09.phx.gbl... Crirus, I whould like some details here if you have some time... On which? I gave at least three ideas ;-)
In reference to your answer to Tom Lehlan, using XML Serialization you can transform the XML document created by the serialization , such that deserialization will create a different graph with different objects. I don't have a specific example handy.
Thanks Jay
"Crirus" <Cr****@datagroup.ro> wrote in message news:eC**************@TK2MSFTNGP09.phx.gbl... I whould like some details here if you have some time...
The main goal I try to do it this way is because I dont want to write
the routine that serialise my members every time I modify the class... Instead taking every member I'm interested in, I whould like to flag
does members and add them to the final string in a for loop. And everytime that for loop have to deal with an instance of another class, I whould like to call an equivalent method like this one in that class I need this kind of serialisation, becasue I dont reload exactly the sam
e graph objects... I use values for a interface, in some smaller classes.
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
"Jay B. Harlow [MVP - Outlook]" <Ja********@email.msn.com> wrote in message news:%2******************@TK2MSFTNGP10.phx.gbl... Crirus, Seeing as you hinted at an Object Graph, I would recommend XML Serialization followed by a XSLT transformation to get it in the format you are
after. I would recommend the XML formatter, over the SOAP formatter, as the SOAP formatter only serializes public properties.
Otherwise you are effectively writing your own serialization code. If you decide the XML Serialization is too heavy weight (which it is). I
would consider using the System.ComponentModel.TypeDescriptor class to get type descriptors information for each class that you can then write loops over to get values. Which will work for properties not fields... For fields
you will need to drop down to Reflection.
Hope this helps Jay
"Crirus" <Cr****@datagroup.ro> wrote in message news:%2******************@TK2MSFTNGP12.phx.gbl... > I have a class. > I need to write a routine in this class, that loop through it's members (in > a instance of the class) and concatenate all members values as
string. > I need to filter does members with a custom attribute (found a way), so only > some of them are considered to be added to final string. > > The hard part is that some members are class instances them selfs
and the > same method should be called for them and the returning string
should be > added to the final string > > Make any sence to anybody? :) > > -- > Ceers, > Crirus > > ------------------------------ > If work were a good thing, the boss would take it all from you > > ------------------------------ > >
I whould highly appreciate if someone help me to make this work..i'm still
very confused about the sample :)
--
Ceers,
Crirus
------------------------------
If work were a good thing, the boss would take it all from you
------------------------------
"Crirus" <Cr****@datagroup.ro> wrote in message
news:%2****************@TK2MSFTNGP10.phx.gbl... I found this sample..it may work, I didnt tested yet
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
"Crirus" <Cr****@datagroup.ro> wrote in message news:%2******************@TK2MSFTNGP12.phx.gbl... I have a class. I need to write a routine in this class, that loop through it's members (in a instance of the class) and concatenate all members values as string. I need to filter does members with a custom attribute (found a way), so only some of them are considered to be added to final string.
The hard part is that some members are class instances them selfs and
the same method should be called for them and the returning string should be added to the final string
Make any sence to anybody? :)
-- Ceers, Crirus
------------------------------ If work were a good thing, the boss would take it all from you
------------------------------
I got this far in custom serialisation issue:
Option Strict On
Imports System.Reflection
Imports Extensions.CustomAttributes
Namespace Extensions.CustomAttributes
<AttributeUsage(AttributeTargets.Field, Inherited:=True,
AllowMultiple:=True)> _
Public Class NoteAttribute
Inherits System.Attribute
End Class
End Namespace
Public Class Test
<Note()> Public FirstMember As Integer = 1234
Public secondMember As Integer = 11
<Note()> Public thirdMember As Integer = 222
<Note()> Public fourMember As Integer = 3333
<Note()> Public test1List() As Test1 = {New Test1("aaaa"), New
Test1("bbbbb"), New Test1("ccccc")}
End Class
Public Class Test1
<Note()> Public FirstMemberT1 As String
Public secondMemberT1 As Integer = 11
Public Sub New(ByVal firstmemberValue As String)
FirstMemberT1 = firstmemberValue
End Sub
End Class
Module modComments
Public Sub Main()
Dim myTest As New Test
Dim strAllFlagged As String = SerializeTypeMembers(myTest)
Console.Write(strAllFlagged)
End Sub
Private Function SerializeTypeMembers(ByVal oObj As Test) As String
Dim strFlagedFields As String
Dim oAttribs() As Object
' Get members of type
Dim oType As Type = oObj.GetType
Dim oMembersInfo() As MemberInfo = oType.GetMembers
For Each oMemberInfo As MemberInfo In oMembersInfo
' Determine if attribute is present
oAttribs = oMemberInfo.GetCustomAttributes(False)
If oAttribs.Length > 0 Then 'I dont test for multiple custom
attribute here
If TypeOf oAttribs(0) Is NoteAttribute Then
' determine member type
Select Case oMemberInfo.MemberType
Case MemberTypes.Field
Dim myMemberInfo As FieldInfo =
oType.GetField(oMemberInfo.Name, BindingFlags.Public Or
BindingFlags.NonPublic Or BindingFlags.Instance)
strFlagedFields = strFlagedFields + "Field " +
oMemberInfo.Name + " have value " + myMemberInfo.GetValue(oObj).ToString +
vbCrLf
End Select
End If
End If
Next
Return strFlagedFields
End Function
End Module
this is the output by now:
Field FirstMember have value 1234
Field thirdMember have value 222
Field fourMember have value 3333
Field test1List have value Test1[]
Now, I have to figure out that test1List is an aray of instances of type
Test1 and make the same call for them as for myTest
I'm questioning myself how they do it on serialisation?
Hi again!
I pushed further that exemple
I designed a strong type collection inherited from CollectionBase, for
Player..Player only have field myName...I added 4 players to collection
All I could came up with was
Case MemberTypes.Field
Dim myMemberInfo As FieldInfo =
oType.GetField(oMemberInfo.Name, BindingFlags.Public Or
BindingFlags.NonPublic Or BindingFlags.Instance)
Try
For Each o As Object In
CType(myMemberInfo.GetValue(oObj), CollectionBase)
strFlagedFields +=
SerializeTypeMembers(o)
Next
GoTo continue
Catch e As Exception
End Try
Try
For Each o As Object In
CType(myMemberInfo.GetValue(oObj), Array)
strFlagedFields +=
SerializeTypeMembers(o)
Next
GoTo continue
Catch e As Exception
End Try
strFlagedFields = strFlagedFields + "Field " +
oMemberInfo.Name + " have value " + myMemberInfo.GetValue(oObj).ToString +
vbCrLf
End Select
continue:
Now the listing:
Field FirstMember have value 1234
Field thirdMember have value 222
Field fourMember have value 3333
Field FirstMemberT1 have value aaaa
Field FirstMemberT1 have value bbbbb
Field FirstMemberT1 have value ccccc
Field myName have value Player1
Field myName have value Player2
Field myName have value Player3
Field myName have value Player4
As you can see, I succeded listing all members from my graph..but...
I dont like that try's-catch specyaly because of forcing the returned type
of the field to CollectionBase..that mean I need to add every type of
collection there... :((
Crirus
"Crirus" <Cr****@hotmail.com> wrote in message
news:em**************@TK2MSFTNGP09.phx.gbl... I got this far in custom serialisation issue:
Option Strict On Imports System.Reflection Imports Extensions.CustomAttributes
Namespace Extensions.CustomAttributes <AttributeUsage(AttributeTargets.Field, Inherited:=True, AllowMultiple:=True)> _ Public Class NoteAttribute Inherits System.Attribute End Class End Namespace
Public Class Test <Note()> Public FirstMember As Integer = 1234 Public secondMember As Integer = 11 <Note()> Public thirdMember As Integer = 222 <Note()> Public fourMember As Integer = 3333 <Note()> Public test1List() As Test1 = {New Test1("aaaa"), New Test1("bbbbb"), New Test1("ccccc")} End Class
Public Class Test1 <Note()> Public FirstMemberT1 As String Public secondMemberT1 As Integer = 11 Public Sub New(ByVal firstmemberValue As String) FirstMemberT1 = firstmemberValue End Sub End Class
Module modComments Public Sub Main() Dim myTest As New Test
Dim strAllFlagged As String = SerializeTypeMembers(myTest) Console.Write(strAllFlagged) End Sub
Private Function SerializeTypeMembers(ByVal oObj As Test) As String Dim strFlagedFields As String Dim oAttribs() As Object ' Get members of type Dim oType As Type = oObj.GetType Dim oMembersInfo() As MemberInfo = oType.GetMembers For Each oMemberInfo As MemberInfo In oMembersInfo ' Determine if attribute is present oAttribs = oMemberInfo.GetCustomAttributes(False) If oAttribs.Length > 0 Then 'I dont test for multiple custom attribute here If TypeOf oAttribs(0) Is NoteAttribute Then ' determine member type Select Case oMemberInfo.MemberType Case MemberTypes.Field Dim myMemberInfo As FieldInfo = oType.GetField(oMemberInfo.Name, BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance) strFlagedFields = strFlagedFields + "Field " + oMemberInfo.Name + " have value " + myMemberInfo.GetValue(oObj).ToString + vbCrLf End Select End If End If Next Return strFlagedFields End Function End Module
this is the output by now:
Field FirstMember have value 1234 Field thirdMember have value 222 Field fourMember have value 3333 Field test1List have value Test1[]
Now, I have to figure out that test1List is an aray of instances of type Test1 and make the same call for them as for myTest I'm questioning myself how they do it on serialisation?
This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Suzanne Vogel |
last post by:
Hi,
Given: I have a class with protected or private data members, some of
them without accessor methods. It's someone else's class, so I can't
change it. (eg, I can't add accessor methods to the...
|
by: bst |
last post by:
Is there a way to iterate through member variables of different names, of
course, one by one from the very first one in a while loop, for example?
Thanks!
|
by: Zap |
last post by:
Widespread opinion is that public data members are evil, because if you
have to change the way the data is stored in your class you have to
break the code accessing it, etc.
After reading this...
|
by: Madhav |
last post by:
Hi all,
I was going through a piece of code which had a very
interesting format. There were two files: one was a .h file, and the
other was a .c file. The .c file had a structure defined in it...
|
by: lovecreatesbeauty |
last post by:
I'm disturbed on this question on a long time. I think if I finally get
understand it with your kind help, I will get close to a excellent C++
programmer. And I only can rely on your expertise and...
| |
by: Asfand Yar Qazi |
last post by:
Hi,
I'm creating a library where several classes are intertwined rather tightly.
I'm thinking of making them all use pimpls, so that these circular
dependancies can be avoided easily, and I'm...
|
by: jaso |
last post by:
Hi,
If have a structure of a database record like this:
struct record {
char id;
char title;
...
};
Is there some way to find out how many member variables there is
in the struct and then...
|
by: Joel Hedlund |
last post by:
Hi!
The question of type checking/enforcing has bothered me for a while, and
since this newsgroup has a wealth of competence subscribed to it, I
figured this would be a great way of learning...
|
by: lovecreatesbea... |
last post by:
Could you tell me how many class members the C++ language synthesizes
for a class type? Which members in a class aren't derived from parent
classes?
I have read the book The C++ Programming...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
| |
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...
| | |