[.NET C#] Custom type parameters via Invoke (Reflection)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Ik heb een klein programmaatje gemaakt wat een WSDL aanroept en daar dynamisch een assembly van maakt. (voorbeeldje op internet gevonden, werkt prima). Vervolgens gebruik ik reflection om de service + methods en bijbehorende parameters van de webservice uit te lezen.
So far so good...

Als ik via reflection een bepaalde methode probeer aan te roepen met custom type properties, dan gaat het casten niet goed:

code:
1
2
object obj = this.webServiceAssembly.CreateInstance(serviceName);
result = mi.Invoke(obj, parameters); // parameters = obj[] (bevat strings)


De foutmelding geeft aan dat het type System.String niet geconverteerd kan worden naar het custom type van de methode van de Web Service. Het probleem is nu hoe ik de types kan converteren naar het custom type die de method van de webservice verwacht?

Edit: Customer in de title moet natuurlijk Custom zijn...

[ Voor 3% gewijzigd door JvdS op 29-07-2011 13:49 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom maak je niet gebruik van een interface? Dan ligt de signature vast en werkt het allemaal een stuk eenvoudiger

C#:
1
2
3
4
5
6
7
8
9
public interface ICustomerHandler
{
  string Process(params string[] args);
}

ICustomerHandler obj = this.webServiceAssembly.CreateInstance(serviceName);
if (obj == null)
   throw new ModelProxyException("Customer");
string result = obj.Process(parameters);


Wij gebruikte een dergelijke constructie voor plugins voordat .NET support had voor generics (.net 1.x)

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Het probleem is dat iedere webservice een andere soort class oplevert met verschillende typen parameters. Of ik begrijp je opmerking over interface verkeerd?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zoek je niet gewoon iets als de wcftestclient? Scheelt je werk ;)

Afbeeldingslocatie: http://www.oxygencode.com/manual/WalkThrough/Images/image104.jpg

Of ben je iets met een dergelijke functionaliteit bewust aan 't bouwen?

[ Voor 37% gewijzigd door RobIII op 29-07-2011 14:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Bedankt voor de tip RobIII, maar ik heb zo m'n redenen om die tool niet te gebruiken.
Heb overigens een simpelere opzet om het probleem uit te leggen.
Stel ik heb een simpele klasse 'MyClass' met een method die een custom type als parameter gebruikt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public class MyClass
    {
        public CustomType Info { get; set; }

        public MyClass()
        {
        }

        public void DoSomething(CustomType info)
        {
            this.Info = info;
        }
    }

    public class CustomType
    {
        public CustomType()
        {

        }
    }


Vervolgens probeer ik de method 'DoSomething' te invoken met een parameter:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Type t = typeof(MyClass);
            object obj = Activator.CreateInstance(t);

            // Find matching constructor. 
            MethodInfo[] mi = t.GetMethods();

            for (int x = 0; x < mi.Length; x++)
            {
                ParameterInfo[] pi = mi[x].GetParameters();
                if (pi.Length == 2) break;
            }

            // Construct the object.   
            object[] consargs = new object[1];
            consargs[0] = 10;
            object reflectOb = mi[2].Invoke(obj, consargs);


De error is dan:
code:
1
Object of type 'System.Int32' cannot be converted to type 'TestProject.CustomType'.

Omdat ik niet cast naar het type CustomType wat de method 'DoSomething' verwacht. Mijn vraag is nu: Hoe kan ik casten naar CustomType terwijl ik die class nog niet ken (de properties kan ik dynamisch ophalen via reflection).

Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Deze kan dicht, heb ontdekt dat ik natuurlijk dat ik CustomType ook moet instantieren dmv Reflection:
code:
1
2
3
4
5
foreach (ParameterInfo pi in mi[2].GetParameters())
            {
                Type pType = pi.ParameterType;
                object objType = Activator.CreateInstance(pType);
            }


:o

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1