Hallo,
kennt sich hier jemand mit Generics aus?
Ich habe eine Generische abstrakte Klasse A mit einem value und action (klassiches Observer Pattern mit Events)
Dann habe ich eine Klasse B die die Klasse A mit dem Typ TestTest (ein Enum) erbt.
In einer Klasse C will ich nun Subscriben, weiß aber den genauen Typ des Enums nicht.
Das Beispiel ist fiktiv und passt daher nicht genau, daher bitte nicht an Kleinigkeiten aufhhängen.
Den kann (im realen durch ein Interface realisiert) Abfragen, aber natürlich nicht als Parameter benutzen (Im Beispiel Option 2).
Auch kann ich nicht die Setter Methode als Parameter Enum verwenden, da es ja nicht mit TestTest übereinstimmt (Option 1)
Auch kann ich nicht eine weitere Subscribe Methode hinzufügen mit Action<Enum> als Parameter und dann zu Action<T> casten (Option 3).
Zurzeit ist das ganze so implementiert, das Action<string> ist und alles vor und zurück gecastet wird, was ich aber gerne vermeiden würde. Weiß jemand wie man dieses Problem "schön" lösen, sprich ohne object oder string als zwischenspeicher zu benutzen?
Vielen Dank schon eimal.
kennt sich hier jemand mit Generics aus?
Ich habe eine Generische abstrakte Klasse A mit einem value und action (klassiches Observer Pattern mit Events)
Dann habe ich eine Klasse B die die Klasse A mit dem Typ TestTest (ein Enum) erbt.
In einer Klasse C will ich nun Subscriben, weiß aber den genauen Typ des Enums nicht.
Das Beispiel ist fiktiv und passt daher nicht genau, daher bitte nicht an Kleinigkeiten aufhhängen.
Den kann (im realen durch ein Interface realisiert) Abfragen, aber natürlich nicht als Parameter benutzen (Im Beispiel Option 2).
Auch kann ich nicht die Setter Methode als Parameter Enum verwenden, da es ja nicht mit TestTest übereinstimmt (Option 1)
Auch kann ich nicht eine weitere Subscribe Methode hinzufügen mit Action<Enum> als Parameter und dann zu Action<T> casten (Option 3).
Zurzeit ist das ganze so implementiert, das Action<string> ist und alles vor und zurück gecastet wird, was ich aber gerne vermeiden würde. Weiß jemand wie man dieses Problem "schön" lösen, sprich ohne object oder string als zwischenspeicher zu benutzen?
Vielen Dank schon eimal.
C#:
public enum TestTest
{
Test1 = 0,
Test2 = 1,
Test3 = 2
}
public interface IA
{
void Subscribe<T>(Action<T> obs);
void Subscribe(Action<Enum> obs);
Type GetT();
}
/*Alternative funktioniert nicht, da auch hier der Type zur Kompilierung angegeben werden muss
public interface IA<T>
{
void Subscribe(Action<T> obs);
void Subscribe(Action<Enum> obs);
Type GetT();
}*/
public abstract class A<T> :IA
{
T Value;
Action<T> Observer;
public virtual void Subscribe<T>(Action<T> obs)//Implementierung des Interfaces...
{
Observer = obs;//Cannot implicitly convert type 'System.Action<T>' to 'System.Action<T>'
}
public virtual void Subscribe(Action<Enum> obs)
{
Action<T> tmp = (Action<T>)Convert.ChangeType(obs, typeof(Action<T>));
//Action implementiert IConvertible nicht
Subscribe(obs);
}
public Type GetT()
{
return typeof(T);
}
}
public class B : A<TestTest>
{
}
public class Display
{
private static IA _instance;
void Start()
{
_instance.Subscribe(SetValue);//Option 1
Type t = _instance.GetT();
_instance.Subscribe<t>(SetValue); //Option 2
_instance.Subscribe<Enum>(SetValue);//Option 3
}
public void SetValue(Enum val)
{
}
/* public void SetValue(TestTest val) // Soll vermieden werden
{
}*/
}
}
Zuletzt bearbeitet: