Avatar billede Slettet bruger
14. september 2012 - 09:55 Der er 3 kommentarer og
1 løsning

Reflection af ref parameter metode

Jeg har denne metode:
public void RenewTokenIfNeeded(ref SecurityToken token, EndpointAddress relyingPartyIdentifier)
        {
            TimeSpan remainingLifeTime = token.ValidTo.Subtract(DateTime.Now.ToUniversalTime());
            if (remainingLifeTime.TotalMinutes < 5)
                token = GetTokenFromADFS(relyingPartyIdentifier);
        }

Jeg skal kalde denne metode via Reflection og skal have ref værdien ud igen for at opdatere den. Jeg har fundet et godt og simpelt eksempel, men det vil ikke som jeg vil. Det returnere blot NULL. Hvad gør jeg galt?

MethodInfo renewMI = tokenManager.GetType().GetMethod("RenewTokenIfNeeded",
                        BindingFlags.Public | BindingFlags.Static,
                        Type.DefaultBinder,
                        new[] { typeof(SecurityToken).MakeByRefType(), typeof(EndpointAddress) },
                        null);
Avatar billede runesoft Nybegynder
14. september 2012 - 10:28 #1
lav dit parameter array så du har en reference til den. Og så vil jeg mene du kan tilgå den i dit parameter array bagefter
Avatar billede runesoft Nybegynder
14. september 2012 - 10:39 #2
object[] par = new object[]{sectoken,endpoint};

MethodInfo renewMI = tokenManager.GetType().GetMethod("RenewTokenIfNeeded",
                        BindingFlags.Public | BindingFlags.Static,
                        Type.DefaultBinder,
                        par,
                        null);
Avatar billede runesoft Nybegynder
14. september 2012 - 10:42 #3
øhh..  det er selvfølgelig når du invoker du skal have par med.
Avatar billede arne_v Ekspert
15. september 2012 - 03:23 #4
Du kan lave den kode noget nemmere.

Men du er noedt til at gemme en ref til dit array, fordi den nye vaerdi gemmes i det array og ikke i den originale vaerdi.

Demo:

using System;
using System.Reflection;

namespace E
{
    public class SomeClass
    {
        public static void SomeMethod(ref int v1, int v2)
        {
            Console.WriteLine("Inside before: " + v1 + " " + v2);
            v1++;
            Console.WriteLine("Inside after: " + v1 + " " + v2);
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            int v1 = 10;
            int v2 = 20;
            Console.WriteLine("Outside before: " + v1 + " " + v2);
            SomeClass.SomeMethod(ref v1, v2);
            Console.WriteLine("Outside after: " + v1 + " " + v2);
            object[] v1v2 = new object[] { v1, v2 };
            typeof(SomeClass).GetMethod("SomeMethod", BindingFlags.Public | BindingFlags.Static).Invoke(null, v1v2);
            Console.WriteLine("Outside after: " + v1 + " " + v2 + " " + v1v2[0] + " " + v1v2[1]);
            typeof(SomeClass).GetMethod("SomeMethod", new Type[] { v1.GetType().MakeByRefType(), v2.GetType() }).Invoke(null, v1v2);
            Console.WriteLine("Outside after: " + v1 + " " + v2 + " " + v1v2[0] + " " + v1v2[1]);
            Console.ReadKey();
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester