Fange innkommende argumentverdier i KeyValuePair Array

stemmer
6

Jeg lurer på hvordan jeg kan hente innkommende argumentene til min metode i en matrise. Eller bare hente verdiene av mine argumenter dynamisk.

Betydning, en samtale som:

MyMethod(10, eleven);

For metode:

void MyMethod(int Test, str Test2) {}

Vil løse i en matrise som:

{{Test => 10}, {Test2, eleven}}

Ville være enda bedre hvis jeg kunne oppnå dette med refleksjon .. Ex. liksom med stakksporing.

Publisert på 07/05/2009 klokken 08:33
kilden bruker
På andre språk...                            


6 svar

stemmer
2

Din beste alternativet er å gjøre det med en anonym type, som vist i dette eksemplet .

Svarte 07/05/2009 kl. 08:39
kilden bruker

stemmer
3

Jeg tenker, hva du leter etter finnes ikke. Det nærmeste du kan ha er params:

MyMethod(params object[] args) 
{
    // if you have to do this, it's quite bad:
    int intArg = (int)args[0];
    string stringArg = (string)arg[1]:
}

// call with any number (and type) of argument
MyMethod(7, "tr");

Det er ingen kompilering type sjekking, og derfor er det ikke en allsidig måte å håndtere argumenter. Men hvis dine argumenter er dynamisk, er det sannsynligvis en løsning.


Edit: hadde en annen idé:

Du må sette alle argument manuelt i en liste / ordbok. Du kan skrive en hjelper klasse for å tillate følgende:

MyMethod(int arg1, string arg2) 
{
    Arguments.Add(() => arg1);
    Arguments.Add(() => arg2);
    //
}

Hjelperen ser slik ut

public static void Add<T>(Expression<Func<T>> expr)
{
    // run the expression to get the argument value
    object value = expr.Compile()();
    // get the argument name from the expression
    string argumentName = ((MemberExpression)expr.Body).Member.Name;

    // add it to some list:
    argumentsDic.Add(argumentName, value);
}
Svarte 07/05/2009 kl. 08:42
kilden bruker

stemmer
0

Nice Spørsmål (1). Jeg tror dette er det du trenger -

MethodBase mb = MethodBase.GetCurrentMethod();
ParameterInfo[] pi = mb.GetParameters();
Svarte 07/05/2009 kl. 08:47
kilden bruker

stemmer
0

En måte jeg vet (ikke sikker på om det er den eneste måten i dag, men det pleide å være) er å bruke aspekt-orientert programmering (AOP), og spesielt avskjæring. Det er litt vondt å rulle den for hånd, men det finnes gode verktøy som kommer til unnsetning. Et slikt verktøy er PostSharp: http://www.postsharp.org/ .

Svarte 07/05/2009 kl. 08:52
kilden bruker

stemmer
0

Siden metoden er å bruke navngitte parametre, hvorfor kan ikke du bare eksplisitt fylle en ordbok med navn og verdier? Det er liten vits i å bruke refleksjon for å få sitt navn siden du allerede kjenner dem.

Som allerede nevnt, kan de parametere ordet benyttes for å definere en metode med et variabelt antall parametre, men ved definisjon de er anonyme.

Jeg er ikke sikker på hva du spør, på den måten du har forklart det, det gjør noe fornuftig. Kanskje du kunne utdype videre?

Svarte 07/05/2009 kl. 09:03
kilden bruker

stemmer
0

Kanskje dette vil ikke være akkurat det du var ute etter, men jeg fant jeg kunne få et rimelig kompromiss for min situasjon ved hjelp av en variant av den metoden Matt Hamilton foreslått og gjøre bruk av den implisitte navngiving av anonyme typeparametere:

public void MyMethod(string arg1, bool arg2, int arg3, int arg4)
{
    var dictionary = new PropertyDictionary(new 
    { 
        arg1, arg2, arg3, arg4 
    });
}

public class PropertyDictionary : Dictionary<string, object>
{
    public PropertyDictionary(object values)
    {
        if(values == null)
            return;

        foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(values))
            Add(property.Name, property.GetValue(values);   
    }
}    

Som jeg sa, kan det ikke være nyttig i din situasjon, men i mine (enhetstesting en metode som behandler XML) det var veldig nyttig.

Svarte 11/12/2012 kl. 00:16
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more