Rozpoznanie o które pole klasy chodzi w funkcji

Rozpoznanie o które pole klasy chodzi w funkcji
ollo98
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Siema, załóżmy że mam taką klasę.

Kopiuj
public class Pilkarz
{
  public int szybkosc;
  public int strzelanie;
}

W ogóle poza tą klasą mam taką funkcję.

Kopiuj
public int returnSum(Pilkarz pilkarz)
{
  int sum=pilkarz.?+pilkarz.?;
  return sum;
}

Problem polega na tym że chcę podać w tej funkcji o jakie pole mi chodzi, żeby funkcja dodała np. 2 razy szybkość piłkarza, albo 2 razy strzelanie piłkarza.
Istnieje może jakiś sposób?
Próbowałem object, string itd. ale nic mi nie przychodzi do głowy..
Z góry dzięki za pomoc. :)

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 216
0
Kopiuj
public int returnSum(Pilkarz pilkarz, string propertyName)
{
  Type type = typeof(Pilkarz);
  int sum= (int)type.GetProperty(propertyName).GetValue(pilkarz) * 2;
  return sum;
}

returnSum(pilkarz, nameof(Pilkarz.szybkosc));
 
ollo98
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

A np. jakbym tego używał wiele razy to da się to jakoś skrócić czy za każdym razem trzeba pisać "(int)type.GetProperty(propertyName).GetValue(pilkarz)"?

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 216
0

Trzeba.

T9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 329
0

Możesz napisać sobie na to metodę albo metodę rozszerzoną ;) i będzie działać jak chcesz. Albo wstawić tą metodę w indekser to mógł byś pisać coś w stylu piłkarz[stringNazwyPola] + piłkarz[innaNazwyPola]. Może da się nawet coś takiego coś takiego generyczny interfejs napisać, albo generyczne rozszerzenie na object ;).

DibbyDum
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Polska, Kraków
1

Ale po co takie jakieś dziwne kombinacje? Co jest złego w:

Kopiuj
public int Sum(int value)
{
    return value * 2;
}
// LUB
public int DoubleSpeed(Footballer footballer)
{
    return footballer.speed * 2;
}

?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
4

@ollo98: nie próbuj sobie tworzyć drogi na skróty, nie warto: dzisiaj wiesz, co Twój kod robi, ale za miesiąc już nie będziesz pamiętać.
A getRunningSpeed(), getShootingSpeed() etc. są ładnie nazwanymi, jasnymi metodami, w porównaniu do get(string name) czy innej. Parę dodatkowych linijek kodu nikogo nie zaboli.

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6969
0

Jeśli chcesz zrobić brzydko, to zrób Dictionary<string, int> () i tam sobie trzymaj te pola ;) Ominiesz wywoływanie metod GetProperty, GetValue.

ollo98
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Ale lepiej zostać przy GetProperty i GetValue?
Ja podałem tylko mały przykład, mój kod jest dużo większy i taka funkcja która będzie "rozpoznawać" pola zaoszczędzi mi dużo linijek prawie że tego samego kodu. :)

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
0

A dlaczego w ogóle by nie uprościć zwyczajnie do properties'ów:

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

class Footballer
{
    private double speed;
    public double Speed
    {
        get { return this.speed * 2; }
    }

    private double shooting;
    public double Shooting
    {
        get { return this.shooting * 2; }
    }

    public Footballer(double speed, double shooting)
    {
        this.speed = speed;
        this.shooting = shooting;
    }
}

class Program
{
    public static void Main(string[] args)
    {
        var footballer = new Footballer(56.1, 89.0);
        Console.WriteLine("Speed: {0}\nShooting: {1}", footballer.Speed, footballer.Shooting);
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.