Temat: iteracja po parametrach metody w C#

Witam!

Pytanie być może lamerskie ale i tak zaryzykuję ;)

Czy w C# jest możliwość iteracji po parametrach wywołania metody w celu sprawdzenia, czy np. wartość któregoś z nich nie jest pusa?

Chciałbym to osiągnąć bez konieczności sprawdzania parametrów jednego po drugim. Coś w stylu foreach(param p in metoda.params) :)
Daniel Dąbrowski

Daniel Dąbrowski Właściciel, 42n

Temat: iteracja po parametrach metody w C#

Za pomoca uzycia reflection. Konkretnie trzeba sie wcisnac za pomoca reflection w callstack jak za pomoca debugera i tam to powinno byc.

I pytanie wcale nie jest lamerskie.

Pozatym to co chesz osiagbnac to wyglada na programowanie aspektowe. Lepiej przyjzyj sie blizej projektowi http://www.postsharp.org/

konto usunięte

Temat: iteracja po parametrach metody w C#

using System;
using System.Reflection;

public delegate void MyDelegate(int i);
public class MainClass
{
public event MyDelegate ev;

public static void Main()
{
Type delegateType = typeof(MainClass).GetEvent("ev").EventHandlerType;
MethodInfo invoke = delegateType.GetMethod("Invoke");
ParameterInfo[] pars = invoke.GetParameters();
foreach (ParameterInfo p in pars)
{
Console.WriteLine(p.ParameterType);
}
}
}

Temat: iteracja po parametrach metody w C#

dzięki za szybkie odpowiedzi :)
Daniel Dąbrowski

Daniel Dąbrowski Właściciel, 42n

Temat: iteracja po parametrach metody w C#

Damian Zapart:
using System;
using System.Reflection;
[cut]
}


Hmm ale ten kod nie zrobi tego => "wartość któregoś z nich nie jest pusa?"

Ten kod tylko mowi o statycznym wyglądzie deklaracji metody.

Jak zamierzalbys go uzyc ?

konto usunięte

Temat: iteracja po parametrach metody w C#

Można spróbować przez pars[i].IsDefined(.....). nie próbowałem nigdy takiego czegoś robić ale może zadziała.
Warto poczytać http://msdn.microsoft.com/en-us/library/system.reflect...Damian Zapart edytował(a) ten post dnia 16.03.09 o godzinie 15:23
Michał M.

Michał M. Professional .NET
Developer

Temat: iteracja po parametrach metody w C#

Ja bym jednak poszedł w AOP i "zwalidował" parametry...
Może być już wspomniany PostSharp lub Microsoft'owy Policy Injection Block... (cześć Enterprise Library).

Temat: iteracja po parametrach metody w C#

A... ekhm... ja z taką pewną nieśmiałością zadam pytanie... a po co się robi coś takiego? Tzn. zamiast explicite sprawdzić parametr po parametrze, to szuka się możliwości jak widać złożonej) przeiterowania po nich w celu sprawdzenia?

Czy chodzi o przypadki, gdy metoda ma kilkanaście parametrów i robi się to po prostu dla wygody?

Czy ze względu na przewidywany częsty refaktoring, gdzie w razie dodania nowego parametru zapomina się o jego sprawdzeniu?

Czy źle zrozumiałem intencję autora?
Stanisław P.

Stanisław P. Software designer

Temat: iteracja po parametrach metody w C#

Łukasz Gałązka:
Czy w C# jest możliwość iteracji po parametrach wywołania metody w celu sprawdzenia, czy np. wartość któregoś z nich nie jest pusa?

Chciałbym to osiągnąć bez konieczności sprawdzania parametrów jednego po drugim. Coś w stylu foreach(param p in metoda.params) :)

To ja się wyłamię ;) Jeśli tych parametrów jest 2-3, to nic prostszego raczej nie stworzysz refleksjami. To tylko linia na parametr - if (...==null) throw new ArgumentNullException();
A jeśli masz więcej niż 3 parametry na funkcję (i jest takich funkcji wystarczająco dużo, żeby robiło Ci to problem), to może lepiej zrobić jakiś refactoring?

konto usunięte

Temat: iteracja po parametrach metody w C#

Stanisław Pitucha:
A jeśli masz więcej niż 3 parametry na funkcję (i jest takich funkcji wystarczająco dużo, żeby robiło Ci to problem), to może lepiej zrobić jakiś refactoring?

Dokładnie! Nie żadne reflection jest tu odpowiedzią a porządny refactoring.

konto usunięte

Temat: iteracja po parametrach metody w C#

Jeżeli szukasz "błędów programisty" to programowanie w oparciu o kontrakty:

public void Foo(SomeType obj)
{
Debug.Assert(obj != null, "obj is null!")

// ...

Debug.Assert(...)
}

albo prosto z MS Research

http://research.microsoft.com/en-us/projects/contracts/

Temat: iteracja po parametrach metody w C#

No ale Łukasz napisał:
Łukasz Gałązka:
Chciałbym to osiągnąć bez konieczności sprawdzania parametrów jednego po drugim. Coś w stylu foreach(param p in metoda.params) :)

:)

A swoją drogą - dzięki za linka :)Adrian Olszewski edytował(a) ten post dnia 16.03.09 o godzinie 18:01

konto usunięte

Temat: iteracja po parametrach metody w C#

No ale jak już ktoś wcześniej napisał, jak masz dużo parametrów to przydałby się refactoring. Po refaktoringu parametrów jest mało więc 3-4 Debug.Assert nikogo nie zabiją (zwłaszcza jak się używa R#). Można rzucać exceptiony można się bawić z Asercjami. Zależy od założeń projektowych, czyli jak interpretujemy wartość null dla danego parametru.

Temat: iteracja po parametrach metody w C#

Oki, zupełnie źle zrozumiałem :)
Wydało mi się, że Autor chce w pętli, a Ty mu i tak polecasz "step-by-step" - zupełnie umknęło mi, że piszesz o "dobrych praktykach" ale już PO refaktoringu :)

konto usunięte

Temat: iteracja po parametrach metody w C#

Nie bylem zbyt precyzyjny. Jak widać, każdy z Nas inaczej zrozumiał pytanie. Może to i lepiej. Autor pytania ma w czym wybierać ;)

Temat: iteracja po parametrach metody w C#

Widzę, że od mojej ostatniej wizyty temat się rozwinął.
Chodziło mi o proste sprawdzenie wartości parametrów metody, ponieważ moja wiedza dotycząca technologii .net dopiero się buduje ;), pchnięty czystą ciekawością zacząłem kombinować, myślałem, że jest na to jakiś prosty sposób, bez zaprzęgania do tego celu skomplikowanych mechanizmów...

Na ten czas poprzestanę jednak na sprawdzaniu w najprostszy sposób.

Dzięki Wam wszystkim za zainteresowanie i pomoc!

Pozdrawiam
Piotr Owsiak

Piotr Owsiak
projektant/programis
ta .NET
(freelance/contrator
), pragma...

Temat: iteracja po parametrach metody w C#

No to może ja pociągnę temat dalej, bo sam kilka miesięcy temu chciałem dokładnie ten sam efekt uzyskać.

Otóż jeśli chodzi o walidację czy parametr nie jest null, to wiadomo, że:
a) najlepiej żeby metoda miała niedużo parametrów (refaktoring)
b) z R# zadanie staje się bardzo szybkie i wygodne

Natomiast ja chciałem logować wartości parametrów do trace'a.
Szukałem sposobu na jakiś uniwersalny kawałek kodu a nie klepanie tego dla każdej metody, ale okazuje się, że to nie jest wcale takie proste.
Ten kod korzystający z refleksji, tak jak pisano wcześniej, nie daje nam wartości tylko info na temat typu itd.
Gdzieś w komentarzach na MSDN widziałem stwierdzenia, że tego się nie da zrobić bez a) instrumentacji kodu
b) gimnastyki na surowo z pamięcią (stos, itd.)

ad a) ponieważ mnie chodziło o logowanie na środowiskach UAT i PRO, więc to rozwiązanie odpada
ad b) ponoć to jest niebezpieczne no i nistety nie jestem jeszcze takim mistrzem ;-)

BTW. PostSharp'a widziałem, ale nie jestem pewien, że potrafi rozwiązać mój mały problem.

Ostatecznie logowanie musiałem pisać do wybranych metod ręcznie :(

Zatem zna ktoś może lepsze rozwiązanie lub wie czy PostSharp da radę?

Temat: iteracja po parametrach metody w C#

Ostatecznym brudnym rozwiązaniem będzie podać tablicę parametrów jako object[] i po nich przeiterować... Oczywista wada - utrata ścisłego typowania. W sumie aż wstyd podawać takie rozwiązanie, ale... :)

EDIT: Stop, jeszcze jedna idea.

Stworzyć szablon klasy parametru, taki wrapper, w którego konstruktorze będzie logowanie wartości parametru. I obiekt dopiero tej klasy podawany jako parametr do właściwej metody...

MojaMetoda(new LogParam(10).value, new LogParam("alamakota").value);Adrian Olszewski edytował(a) ten post dnia 20.03.09 o godzinie 12:25
Piotr Owsiak

Piotr Owsiak
projektant/programis
ta .NET
(freelance/contrator
), pragma...

Temat: iteracja po parametrach metody w C#

No proszę, nie ma to jak StackOverflow:

http://stackoverflow.com/questions/362124/how-to-trace...

Temat: iteracja po parametrach metody w C#

Na szybko.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SzablonTest
{
class Program
{
static void Main(string[] args)
{
Testowa t = new Testowa();

t.MojaMetoda(new LogParam<int >(10).Value, new LogParam<string >("AlaMaKota").Value);

Console.ReadKey();
}
}

class Testowa
{
public void MojaMetoda(int ParamInt, string ParamString)
{
Console.WriteLine("W metodzie: {0}, {1}", ParamInt, ParamString);
}
}

public class LogParam<T >
{
T param;
public LogParam(T param)
{
this.param = param;

// logowanie wartości
Console.WriteLine(param.ToString());
}

public T Value
{
get { return this.param; }
}
}
}


PS: czy ten cho...rny silnik musi zjadać nawiasy ostre?! Już mnie to do ..... doprowadza :/

Żebym w tagu code musiał zamieniać nawiasy na encje html.....

Można to zrobić lepiej:
http://pl.wikipedia.org/wiki/Klasy_parametryzowane_wyt...Adrian Olszewski edytował(a) ten post dnia 20.03.09 o godzinie 12:44

Następna dyskusja:

C# - iteracja po polach klasy




Wyślij zaproszenie do