Frage

Ich möchte eine generische Klasse machen, die nur serializable Klassen akzeptiert, kann es mit dem, wo Zwang getan werden?

Das Konzept ich suche, ist dies:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]
War es hilfreich?

Lösung

Nein, ich fürchte nicht. Die einzigen Dinge, die Sie können mit Einschränkungen tun sind:

  • where T : class - T muss ein Referenztyp sein
  • where T : struct - T muss ein Nicht-Nullable-Wertetyp sein
  • where T : SomeClass - T muss Someclass sein oder daraus ziehen
  • where T : ISomeInterface - T muss ISomeInterface sein oder umzusetzen
  • where T : new() - T muss eine öffentliche parameterlosen Konstruktor haben

Verschiedene Kombinationen sind möglich, aber nicht alle. Nichts über Attribute.

Andere Tipps

Was ich weiß; du kannst das nicht machen. Haben Sie jedoch über eine ‚initialisieren‘ Methode oder etwas ähnliches hinzuzufügen?

public void Initialize<T>(T obj)
{
     object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
     if(attributes == null || attributes.Length == 0)
          throw new InvalidOperationException("The provided object is not serializable");
}

Ich habe diesen Code nicht getestet, aber ich hoffe, dass Sie meinen Punkt.

Angst nicht. Beste, was Sie tun können, ist eine Laufzeitprüfung auf Type.IsSerializable .

Wenn Sie für jede Klasse suchen, serializable ist, ich glaube, Sie kein Glück. Wenn Sie Objekte suchen, die Sie erstellt haben, können Sie eine Basisklasse erstellen, die serialisierbar ist und haben jede Klasse, die Sie unterstützen, von ihm wollen abzuleiten.

Ich weiß, das ist alt, aber ich bin mit einem statischen Konstruktor zu überprüfen. Es ist später aber können Sie einen Fehler zur Laufzeit werfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top