Pole klasy jako parametr

0

Z góry przepraszam za nazwę tematu ale nawet nie wiem jak to nazwać. Mam klasę Foo, która zawiera propercje A, B oraz C. Mam trzy metody, które robią to samo, tylko jedna działa na A, druga na B, trzecia na C, np.

void ChangeA()
{
...
A += 5;
}

void ChangeB()
{
...
B += 5;
}

Chciałbym je przerobić na jedną metodę zawierającą parametr (tylko jakiego typu?), który umożliwia wybór propercji. Metoda wywoływana np. dla A będzie tak: Change(obj => obj.A).

0
 using System;

enum SomeClassParam {X,Y,Z}

class SomeClass
{
  private int x;
  private int y;
  private int z;
  
  public void ChangeValue(SomeClassParam param)
  {
    switch(param)
    {
      case SomeClassParam.X:
      x += 5;
      break;
      case SomeClassParam.Y:
      y += 5;
      break;
      case SomeClassParam.Z:
      z += 5;
      break;
    }
  }
}

class MainClass
{
  public static void Main (string[] args)
  {
    SomeClass sc = new SomeClass();
    
    sc.ChangeValue(SomeClassParam.Y);
  }
}
      

coś takiego?

0

Mozna tez uzyc Expression + refleksja:

public class Foo
{
	public int A { get; set; }
	public int B { get; set; }
	public int C { get; set; }

	public override string ToString()
	{
		return $"A:{A};B:{B};C:{C}";
	}

	public void Change(Expression<Func<Foo, int>> memberLamda)
	{
		var memberSelectorExpression = memberLamda.Body as MemberExpression;
		if (memberSelectorExpression != null)
		{
			var property = memberSelectorExpression.Member as PropertyInfo;
			property?.SetValue(this, (int)property.GetValue(this) + 5, null);
		}
	}
}

class Program
{
	static void Main()
	{
		Foo foo = new Foo {A = 2, B = 7, C = 33};

		Console.WriteLine(foo);

		foo.Change(obj => obj.A);

		Console.WriteLine(foo);

		foo.Change(obj => obj.B);

		Console.WriteLine(foo);

		foo.Change(obj => obj.C);

		Console.WriteLine(foo);

		foo.Change(obj => obj.C);

		Console.WriteLine(foo);
	}
}

Zadziala tylko dla propert typu int.

A jak bardzo potrzebujesz to mozna tez napisac generyczna extension method podobna do tego lub tego (powyzsze jest wariacja tego podejscia dostosowana do tego konkretnego przypadku)

4

Zamiast ochydnego switcha i uzycia na sile refleksji ja bym uzyl po prostu dziedziczenia i konkretne implementacje dla danej metody wrzucil do konkretnych klas.

Wtedy polimofrizm zalatwia za nas wybieranie odpowiedniego code path

0
  using System;
 
enum SomeClassParam {X,Y,Z}
 
class SomeClass
{
  public int x;
  public int y;
  public int z;
  
  public void Show()
  {
    Console.WriteLine(x);
    Console.WriteLine(y);
    Console.WriteLine(z);
  }
}

class Methods
{
  public static void ChangeVal(ref int num)
  {
    num += 5;
  }
}

 
class MainClass
{
  public static void Main (string[] args)
  {
    SomeClass sc = new SomeClass();
    
    sc.Show();
    Console.WriteLine("---------------");
    Methods.ChangeVal(ref sc.x);
    Methods.ChangeVal(ref sc.z);
    sc.Show();
    
  }
}

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