Der Beispielcode ist etwas fehlerhaft, da sie unterschiedliche Signaturen haben (String vs. int für das zweite Argument). Daher würde das Übergeben eines int oder String bereits die richtige Überladung auswählen.
Wenn Sie unterschiedliches Verhalten mit derselben Methodensignatur wünschen, schalten Sie einfach das Enum um:
switch(calcOpr){
case Operator.Concat:
calcOperator = calcOpr;
sourceType = dataType;
break;
case Operator.Padleft:
calcOperator = calcOpr;
sourceType = dataType;
break;
default:
// Fehler werfen?
}
Bearbeiten (zu Ihrem Edit)
Eine Methode hat eine feste Signatur, daher müssten Sie, wenn Sie einen Konstruktor möchten, der den richtigen Typ basierend auf dem Operator erstellt, alle möglichen Argumente dort angeben. (schlechter Code):
public Calc( Operator calcOpr, string sourceName, string newString, int startindex, int count )
{
switch(calcOpr){
case Operator.Concat:
// Überprüfen von sourceName und newString
case Operator.Padleft
// Überprüfen von startindex und count
}
Riecht nicht gut.
Ich würde wohl separate Methoden anstelle von Konstruktorüberladungen verwenden (statisch, damit Sie sie vom Typ aus aufrufen können):
public static Calc GetConcat(string SourceName, string newString){
Class c = new Class();
c.calcOperator = Operator.Concat;
c.sourcetype = dataType; //Woher kommt dieses?
//etc..
return c;
}
public static Calc GetPadLeft(int startindex, int count){
Class c = new Class();
c.calcOperator = Operator.PadLeft;
c.sourcetype = dataType; //Woher kommt dieses?
// etc
return c;
}
Sie könnten auch überlegen, abgeleitete Klassen für Concat und PadLeft zu erstellen, die von Calc abgeleitet sind und Methoden überladen oder spezifische Eigenschaften hinzufügen. Eigentlich glaube ich, dass das ist, was ich tun würde, aber Sie müssten ein wenig mehr darüber sagen, was Sie genau tun.