Rozpoznanie o które pole klasy chodzi w funkcji

0

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

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

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

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. :)

0
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));
 
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)"?

0

Trzeba.

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 ;).

1

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

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

?

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.

0

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

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. :)

0

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

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);
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1