Nein, Sie können keine einzelne Methodenüberladung erstellen, die einen von zwei festen Typen für einen bestimmten Parameter akzeptiert.
Das Beste, was Sie (während noch mehr Überlastungen zu vermeiden) tun können, ist eine neue Art zu schaffen, mit dem Sie eine Instanz durch einen von zwei verschiedenen Arten schaffen könnten, und eine Instanz von dass zu akzeptieren.
public class MyJSON
{
public MyJSON(JObject json)
{
FirstOption = json;
FirstOptionValid = true;
}
public MyJSON(File json)
{
SecondOption = json;
SecondOptionValid = true;
}
public JObject FirstOption { get; private set; }
public bool FirstOptionValid { get; private set; }
public File SecondOption { get; private set; }
public bool SecondOptionValid { get; private set; }
public static implicit operator MyJSON(File json)
{
return new MyJSON(json);
}
public static implicit operator MyJSON(JObject json)
{
return new MyJSON(json);
}
}
Sie könnten sogar implizite Konvertierungen von JObject
und File
-MyJSON
erstellen, so dass ein Benutzer tatsächlich ein JObject
oder File
Objekt MyMethod
, ohne auch nur, um überhaupt einen Vermittler Objekt explizit zu konstruieren passieren kann.
In der Tat, es ist eigentlich sehr einfach durch Verwendung von Generika dies für jede festgelegte Anzahl von Arten zu verallgemeinern:
public class Option<T1, T2>
{
public Option(T1 value)
{
FirstOption = value;
FirstOptionValid = true;
}
public Option(T2 value)
{
SecondOption = value;
SecondOptionValid = true;
}
public T1 FirstOption { get; private set; }
public bool FirstOptionValid { get; private set; }
public T2 SecondOption { get; private set; }
public bool SecondOptionValid { get; private set; }
public static implicit operator Option<T1, T2>(T2 value)
{
return new Option<T1, T2>(value);
}
public static implicit operator Option<T1, T2>(T1 value)
{
return new Option<T1, T2>(value);
}
}
Wir haben jetzt Ihre Methode als schreiben:
public static void MyMethod(Option<JObject, File> json1, Option<JObject, File> json2)
Was ist der Vorteil? Stellen Sie mehrere Überladungen mit verschiedenen Signaturen bereit. –
Intern müsste man Code schreiben, um herauszufinden, um welchen Typ es sich bei jedem Parameter handelt und wie man damit umgehen kann. An diesem Punkt können Sie sowieso die separaten Methodenüberladungen verwenden. –
'JObject' und' File' Klassen hat ziemlich verschiedene Mitglieder und implementiert keine gemeinsame Schnittstelle. Also ist diese "kombinierte" Methode voll von Spaghetti Code wie 'if (jsonOne ist Datei) {.....} sonst if (isonOne ist JObject) {...}' –