Reflection on COM object.

Discussion in 'ASP .Net' started by Lars Nielsen, Jul 16, 2003.

  1. Lars Nielsen

    Lars Nielsen Guest

    Hi everybody,

    I've run into a problem when using the reflection assembly on COM objects
    and been browsing around the net for some while. Apparently a few has asked
    the same question though no answer has ever occoured.

    This is what I'm trying to do:

    I wish to build a function that crawls any COM object (interop). I did
    shortly examine the serializer until I realized it's used for translation
    and not reflection). Until now it work's quite fine until it returns an
    array of strings:

    Public Function ReturnAbstractObject(ByVal o As Object) As XmlDocument
    Dim type As System.Type
    type = o.GetType()

    Dim propertyinfo As System.Reflection.PropertyInfo

    For Each propertyinfo In type.GetProperties()

    If propertyinfo.PropertyType.FullName = "System.String" Then
    Dim s As String
    s = propertyinfo.GetValue(o, Nothing).ToString() ' HERE IT GOES
    WRONG
    End If

    Next
    :
    End Function


    When returning an array of strings (mind you, the
    propertyinfo.GetType().IsArray returns false) I get the following error:
    "Parameter count mismatch".

    It's the propertyinfo.GetValue(o, Nothing) that raises an error. I cannot
    find an example (that works) where the second parameter are used (this is
    the Index parameter). I may be wrong in the entire approch, and would gladly
    receive any help you guys may offer.

    In advance thanks,

    Lars Nielsen

    (If mailing the answer, - please remove the CAPS from the email)
     
    Lars Nielsen, Jul 16, 2003
    #1
    1. Advertising

  2. Lars,

    The second parameter should be used for indexers, which is not what you
    want to use, a property that exposes an array of strings is a regular
    property, not an indexer. You should not use this overload. What is the
    COM signature of the property?


    --
    - Nicholas Paldino [.NET/C# MVP]
    -

    "Lars Nielsen" <> wrote in message
    news:...
    > Hi everybody,
    >
    > I've run into a problem when using the reflection assembly on COM objects
    > and been browsing around the net for some while. Apparently a few has

    asked
    > the same question though no answer has ever occoured.
    >
    > This is what I'm trying to do:
    >
    > I wish to build a function that crawls any COM object (interop). I did
    > shortly examine the serializer until I realized it's used for translation
    > and not reflection). Until now it work's quite fine until it returns an
    > array of strings:
    >
    > Public Function ReturnAbstractObject(ByVal o As Object) As XmlDocument
    > Dim type As System.Type
    > type = o.GetType()
    >
    > Dim propertyinfo As System.Reflection.PropertyInfo
    >
    > For Each propertyinfo In type.GetProperties()
    >
    > If propertyinfo.PropertyType.FullName = "System.String" Then
    > Dim s As String
    > s = propertyinfo.GetValue(o, Nothing).ToString() ' HERE IT GOES
    > WRONG
    > End If
    >
    > Next
    > :
    > End Function
    >
    >
    > When returning an array of strings (mind you, the
    > propertyinfo.GetType().IsArray returns false) I get the following error:
    > "Parameter count mismatch".
    >
    > It's the propertyinfo.GetValue(o, Nothing) that raises an error. I cannot
    > find an example (that works) where the second parameter are used (this is
    > the Index parameter). I may be wrong in the entire approch, and would

    gladly
    > receive any help you guys may offer.
    >
    > In advance thanks,
    >
    > Lars Nielsen
    >
    > (If mailing the answer, - please remove the CAPS from the email)
    >
    >
     
    Nicholas Paldino [.NET/C# MVP], Jul 16, 2003
    #2
    1. Advertising

  3. Lars,

    >Until now it work's quite fine until it returns an array of strings:


    It sounds more like you're seeing a parameterized property (a.k.a.
    indexer in C#), that takes an index argument and returns a single
    string, as opposed to returning an entire array. That would explain
    why IsArray for the property type returns false, and why you get the
    exception.

    If the property takes an integer argument specifying the index, you
    should be able to query it like this

    s = propertyinfo.GetValue(o, New Object() {index}).ToString()

    You can find out more about the parmeters a property takes by checking
    PropertyInfo.GetIndexParameters().



    Mattias

    --
    Mattias Sjögren [MVP] mattias @ mvps.org
    http://www.msjogren.net/dotnet/
    Please reply only to the newsgroup.
     
    Mattias Sjögren, Jul 16, 2003
    #3
  4. Lars,

    >However, this does not seem to supply any method to get the length of the
    >index. Do you, or anybody else, know any way to extract such a value?


    Not all parameterized properties wrap arrays, so index parameters
    might not be numeric, and there can be more than one. So it's close to
    impossible to write generic code that queries such properties without
    any knowledge of the implementation.



    Mattias

    --
    Mattias Sjögren [MVP] mattias @ mvps.org
    http://www.msjogren.net/dotnet/
    Please reply only to the newsgroup.
     
    Mattias Sjögren, Jul 18, 2003
    #4
  5. Lars Nielsen

    Lars Nielsen Guest

    Yes, that's what I feared.

    Do you know any way to express an (any) Object as XML ?

    I'm curious; Is it possible to get the length (or upperbound) from the
    index?

    By the way, thanks for the help. It has clearifyed many "dimmed" areas.


    -- Lars


    "Mattias Sjögren" <> wrote in message
    news:...
    > Lars,
    >
    > >However, this does not seem to supply any method to get the length of the
    > >index. Do you, or anybody else, know any way to extract such a value?

    >
    > Not all parameterized properties wrap arrays, so index parameters
    > might not be numeric, and there can be more than one. So it's close to
    > impossible to write generic code that queries such properties without
    > any knowledge of the implementation.
    >
    >
    >
    > Mattias
    >
    > --
    > Mattias Sjögren [MVP] mattias @ mvps.org
    > http://www.msjogren.net/dotnet/
    > Please reply only to the newsgroup.
     
    Lars Nielsen, Jul 18, 2003
    #5
  6. Lars,

    >Do you know any way to express an (any) Object as XML ?


    No, I don't. Usually COM objects take care of their own persistance
    and exposes it by implementing one or more of the IPersist interfaces.


    >I'm curious; Is it possible to get the length (or upperbound) from the
    >index?


    I guess you could look for a property called Count or Length or
    something like that. But that wouldn't work in all situations.



    Mattias

    --
    Mattias Sjögren [MVP] mattias @ mvps.org
    http://www.msjogren.net/dotnet/
    Please reply only to the newsgroup.
     
    Mattias Sjögren, Jul 18, 2003
    #6
  7. Lars Nielsen

    Lars Nielsen Guest

    Mattias,

    That will off course pose as a problem when making a general COM object
    reflection class (that dumps all values). You must then know something about
    the object.

    Thank you very much for your help. When my class is done, I will do a repost
    as a Q - > A as a help to others that tries the same.


    Best regards,

    Lars Fløe Nielsen




    "Mattias Sjögren" <> wrote in message
    news:...
    > Lars,
    >
    > >Do you know any way to express an (any) Object as XML ?

    >
    > No, I don't. Usually COM objects take care of their own persistance
    > and exposes it by implementing one or more of the IPersist interfaces.
    >
    >
    > >I'm curious; Is it possible to get the length (or upperbound) from the
    > >index?

    >
    > I guess you could look for a property called Count or Length or
    > something like that. But that wouldn't work in all situations.
    >
    >
    >
    > Mattias
    >
    > --
    > Mattias Sjögren [MVP] mattias @ mvps.org
    > http://www.msjogren.net/dotnet/
    > Please reply only to the newsgroup.
     
    Lars Nielsen, Jul 18, 2003
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Stalin
    Replies:
    1
    Views:
    506
    Roedy Green
    Sep 29, 2005
  2. Twister.net

    object reflection

    Twister.net, Mar 16, 2006, in forum: C++
    Replies:
    2
    Views:
    295
    Twister.net
    Mar 22, 2006
  3. Stefan Ram
    Replies:
    1
    Views:
    352
    Owen Jacobson
    May 21, 2008
  4. Kyle Heon
    Replies:
    3
    Views:
    137
    Austin Ziegler
    Jul 10, 2005
  5. Guest
    Replies:
    16
    Views:
    467
    Eric J. Roode
    Nov 14, 2004
Loading...

Share This Page