C# Methode generalisieren?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Das geht nur mit Reflection.

Du musst dir erst vom Converter-Typ die MethodInfo für die "GetEnumFromValue"-Methode holen, da gibt's dann eine MakeGenericMethod-Methode, der Du den Typ mitgeben kannst. Das kannst Du dann mit Invoke aufrufen und das Ergebnis musst Du dann nach Enum casten.
Also ganz einfach :D

Oder Du überlegst dir ein anderes Konzept ;)
Reflection ist nur selten die beste Wahl.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler
Dultus, UserMod Light  
Fragesteller
 24.01.2023, 20:13

Mir ist kurz nach der Frage etwas eingefallen (wie es oft und gerne so ist...)

Das Enum.Parse kann ich auch einfach über den typeof ausgeben..

public static object GetEnumFromValue(Type typ, string value)
{
	return Enum.Parse(typ, value);
}

public static IEnumerable<Enum> TransformIdToEnums(string value, params Type[] enums)
{
	string[] values = value.Split(',');
	for (int i = 0; i < enums.Length; i++)
	{
		var type = enums[i];
		yield return (Enum)Converter.GetEnumFromValue(type, values[i]);
	}
}

Das sieht in der Praxis dann so aus;

var val = Utils.InteractionFormatter.TransformIdToEnums("0,1", typeof(Utils.typ1), typeof(Utils.typ2)).ToList();
var val1 = (Utils.typ1)val[0];
var val2 = (Utils.typ2)val[1];

Ist jetzt natürlich nicht schön und muss ich noch umbauen (wie Exceptionhandling), aber so läufts. :-)

0
Palladin007  24.01.2023, 20:23
@Dultus, UserMod Light
wie es oft und gerne so ist

Ich kann dir auch sagen, warum :D
Beim Erklären durchdenkt man das Problem ganz anders, daher ja auch das Rubberduck Debugging.
Ich mach das immer im Kopf, wie als würde ich einen Foren-Post schreiben.

Aber ja, so eine Lösung habe ich fast schon erwartet.
Generics sind cool, können aber schnell zum Problem werden, wenn man es übertreibt.

wie Exceptionhandling

Hoffentlich *richtiges* Exception handling? :D

  • Nur, wenn Du die Exception behandeln kannst,
  • oder wenn Du auf die Exception erweitern/kapseln willst,
  • oder der aktuelle Ablauf die Kontrolle verlieren würde (z.B. Programm stürzt ab),
  • (oder finally, wenn man auch im Fehlerfall etwas tun muss)

In den allermeisten Fällen ist also gar kein Exception handling das richtige Exception handling - klingt paradox, ist aber so, sind ja Ausnahmen und nicht die Regel.

Ich sehe viel zu häufig falsches Exception handling :/

0
Dultus, UserMod Light  
Fragesteller
 24.01.2023, 20:35
@Palladin007

Hier schmeiße ich einfach eine Exception, wenn die Länge der values und der enums nicht übereinstimmt. Da möchte ich gerne eine Rückmeldung haben, wenn dem so ist. :D

0
Palladin007  24.01.2023, 20:38
@Dultus, UserMod Light

Ja, das ist eine sinnvolle Anwendung :D
Eigene Exceptions werfen, wann immer irgendwas nicht so ist, wie es soll.

Ich habe jetzt schon befürchtet, da kommt ein try-catch drum, was dann entweder nichts tut, oder die Exception weg logt und danach ignoriert oder eine nichts sagende Exception wirft oder "throw ex", etc.

0
Dultus, UserMod Light  
Fragesteller
 24.01.2023, 20:39
@Palladin007

Dann brauche ich auch keine Exceptions, sondern mache etwas falsch. xD

Ne, solche Gebilde mache ich nicht, sondern nutze sie, wozu sie gedacht sind. :-)

0
Palladin007  24.01.2023, 20:45
@Dultus, UserMod Light
Dann brauche ich auch keine Exceptions, sondern mache etwas falsch

Naja, falsch machen wir alle irgendwas - immer :D
Ich werfe lieber eine Exception zu viel, als zu wenig, wenn ich dafür kaputte Daten in der DB vermeiden kann.
Und ich erstelle mir auch ein Haufen eigene Exception-Typen, macht sowohl das Suchen als auch das Verständnis leichter und für Logging oder späteres Behandeln (falls möglich) kann ich auch noch relevante Informationen in die Exception mit geben.

Ich hab schon so viel grausiges Zeug gesehen, da frage ich lieber zwei mal nach, um sicher zu gehen, dass es am Ende kein Mist wird.

1
Dultus, UserMod Light  
Fragesteller
 24.01.2023, 20:47
@Palladin007

Gibt es eigentlich einen Weg, kurvige Klammern auszulassen, wenn die Methode keinen Codekörper hat?

Bspw.

public MismatchedEnumLengthsException() : base("Length of values and enums are different. You are required to pass as many values as there are enums")
{
}

Da bräuchte ich ja die Klammern nicht und die stören optisch etwas. :-)

0
Palladin007  24.01.2023, 21:37
@Dultus, UserMod Light

Die heißen "Geschweifte Klammern" :P

Aber nein, gibt's nicht.
Es gibt nur den Expression body:

public void Test(int a)
    => Test(a, default);

public void Test(int a, int b)
{
}

Lass einfach so, mit STRG + M + O klappt der alles zu und mit STRG + M + M klappt er den Member, wo gerade der Cursor ist auf oder zu - zumindest bei mir und Visual Studio. Die Funktionen findest Du auch im Kontextmenü unter Outlining.

1