Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 10 odgovora
  • 3.618 pregleda

Najnovija ↓

Refleksija - Povlacenje metode 01.12.2011. u 15:55 · pre 181 mesec #1
Da li je moguce refleksijom pozvati mutator?

Imam klasu:
Code:

        public string Name { get; set; }
        public DateTime DateCreated {get; set;}


Implementirana klasa:
Code:

public class FirstImpl : Plugin.Plugin, IPlugin
    {
        public FirstImpl()
        {
            Name = "First Implementation";
            DateCreated = DateTime.Now;
        }

        void IPlugin.Print()
        {
            Console.WriteLine("Plugin name is: " + Name + " This Plugin was created on: " + DateCreated);
        }
    }


Refleksija:
Code:

            Assembly a = Assembly.LoadFile(DestinationLocation);
            Type type = a.GetType("FirstPlugin.FirstImpl");
            MethodInfo methodInfo = type.GetMethod("get_Name"); //Interni metod za getter

            object result = null;

            object classInstance = Activator.CreateInstance(type, null);

            result = methodInfo.Invoke(classInstance, null);


Ne radi. Metod se ne izvrsava.

Ako preradim osnovnu klasu, tj. dodam "rucni metod" za izvlacenje imena:
Code:


 public string DajMiIme() // potrebno za refleksiju
        {
            return Name;
        }


Onda kada refleksijom pozovem metod DajMiIme, radi.

Mislim i ovo rijesenje je ok, ali ako vec imam get;set zasto nesto dodavati?

Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Re: Refleksija - Povlacenje metode 01.12.2011. u 16:11 · pre 181 mesec #2
Ne znam sada na brzinu odgovor ali svakako mozes refleksijom procitati property pa ti nije ni neophodno da pozivas taj ugradjeni get metod.
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Sviđa mi se1
Re: Refleksija - Povlacenje metode 01.12.2011. u 16:12 · pre 181 mesec #3
S druge strane, ako vec imas interface, castuj i pozivaj property na normalan nacin. Tome (bi trebalo da) i sluzi :)
Potpis
Nebojsa Milanovic:
-Trumpa smatram vrhunskim predsednikom i voleo bih da živim u državi na čijem je on čelu
-Rusija ne laže, ne vodi osvajačke ratove
-Trump je svetla tačka u USA blatu
-Elon Musk, možda najpametniji i najtrezveniji Amerikanac
Re: Refleksija - Povlacenje metode 01.12.2011. u 16:14 · pre 181 mesec #4
Ne mozes pretpostavljati ime mutatora/accessora, moras ici kao za regularni property

dakle kroz reflekziju izvuces PropertyInfo za Name i onda pozvati njegov GetGetMethod() koji vraca MethodIfno za get accessor.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refleksija - Povlacenje metode 01.12.2011. u 16:19 · pre 181 mesec #5
Citat:
mmix: Ne mozes pretpostavljati ime mutatora/accessora, moras ici kao za regularni property

dakle kroz reflekziju izvuces PropertyInfo za Name i onda pozvati njegov GetGetMethod() koji vraca MethodIfno za get accessor.


Ne pretpostavljam ime mutatora, kada pozovem sve metode iz dll-a, zaista se tako i zove.

Potpis

[IMG]http://img233.imageshack.us/img233/5078/thumbnailte1.th.jpg[/IMG]


They say I look like daddy :D
Re: Refleksija - Povlacenje metode 01.12.2011. u 16:44 · pre 181 mesec #6
Nije isto,

npr sledeci sors:

Code (csharp):

    public class Klasa
    {
        public string Name { get; set; }
        public string ManualNameAccessor() { return Name; }
    }
 


daje sledeci IL:

Code:


.class public auto ansi beforefieldinit Klasa extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
        .maxstack 8
        L_0000: ldarg.0 
        L_0001: call instance void [mscorlib]System.Object::.ctor()
        L_0006: ret 
    }

    .method public hidebysig instance string ManualNameAccessor() cil managed
    {
        .maxstack 1
        .locals init ([0] string CS$1$0000)
        L_0000: nop 
        L_0001: ldarg.0 
        L_0002: call instance string DemoLib.Klasa::get_Name()
        L_0007: stloc.0 
        L_0008: br.s L_000a
        L_000a: ldloc.0 
        L_000b: ret 
    }


    .property instance string Name
    {
        .get instance string DemoLib.Klasa::get_Name()
        .set instance void DemoLib.Klasa::set_Name(string)
    }

    .method public hidebysig specialname instance string get_Name() cil managed
    {
        .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
        .maxstack 1
        .locals init ([0] string str)
        L_0000: ldarg.0 
        L_0001: ldfld string DemoLib.Klasa::<Name>k__BackingField
        L_0006: stloc.0 
        L_0007: br.s L_0009
        L_0009: ldloc.0 
        L_000a: ret 
    }

    .method public hidebysig specialname instance void set_Name(string 'value') cil managed
    {
        .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
        .maxstack 8
        L_0000: ldarg.0 
        L_0001: ldarg.1 
        L_0002: stfld string DemoLib.Klasa::<Name>k__BackingField
        L_0007: ret 
    }

    .field private string <Name>k__BackingField
    {
        .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
    }

}


Pogledaj razliku izmedju accessora i manuelne metode:

.method public hidebysig specialname instance string get_Name() cil managed
.method public hidebysig instance string ManualNameAccessor() cil managed

to je indikacija JITu da metod nije standardni i da je upotrebljen negde druge (u definicji propertija), samim tim do njega dolazis tom putanjom.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refleksija - Povlacenje metode 02.12.2011. u 20:35 · pre 181 mesec #8
U kojoj situaciji moze da ti zatreba get accessor metoda ali ne i property, tj. zasto uopste postoji GetGetMethod? Cisto spekulativno...
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: Refleksija - Povlacenje metode 02.12.2011. u 21:34 · pre 181 mesec #9
zato sto ime Get_PropeortyName nije zagarantovano, sledeca verzija kompajlera ili neki totalno deseti kompajler moze da ga imenuje potpuno drugacije.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Refleksija - Povlacenje metode 05.12.2011. u 09:07 · pre 181 mesec #10
Ok kapiram to, mislio sam kada moze da ti zatreba GetGetAccessor() umesto obicnog GetValue()?
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Re: Refleksija - Povlacenje metode 05.12.2011. u 10:21 · pre 181 mesec #11
deferred execution? Metod koji prima MethodInfo parametar pa poziva po potrebi. Nije bas svakodnevna potreba (ni refleksija to nije) ali mozda zatreba.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme