c# - Storing a generic class and calling an overridden method in its non-generic derived class -


yeah. talk confusing titles. scenario: i've generic class promiselistener looks this:

public class promiselistener<t> {     public virtual void isresovled(t value)     {         return;     }      public virtual void isspoiled()     {         return;     } } 

this class supposed implemented , methods overridden. implementation of class may this:

public class testpromiselistener : promiselistener<float> {     public override void isresovled(float value)     {         system.diagnostics.debug.writeline("rmi returned value " + value);     } } 

this testpromiselistener what's implemented users. need store listeners in dictionary (key irrelevant problem). context of problem: promise unresolved return-value of remote method may resolve actual value. promise returned when remote method invocation made. can "install" promiselistener methods have been implemented derived class (testpromiselistener). 1 of these methods isresovled takes 1 argument: return value of remote method invocation. method called when remote method invocation returns value.

i'm having trouble storing objects in dictionary. store listeners object, don't see how listener dictionary without knowing type first, because need know original type cast to. when fetching promiselistener know type of return value (and information fetch right listener dictionary). i'm asking is: there type-safe way store these generic objects, fetch them , call methods?

(some more detailed info requested - sorry wall of text) both isresolved , isspoiled may called @ different times. promise can resolve if return value has been received (calls isresolved) or may spoiled when no return value received (due network error, example) (calls isspoiled). promiselistener user implements may choose override of these methods. internally have method called when return value has been received network. in method have identifier listener (key in mentioned dictionary), actual return value (object) , assemblyqualifiedname of return value (which can use convert return value of type object correct type). i'll have find correct listener - can because have identifier - don't know how fetch in type-save way because don't know type listener supposed be.

?type? listener; // don't know type listener is. promiselistener<string> or promiselistener<int> - or anything, if(promisemanager.trygetpromiselistener(promise, out listener) ... 

is there reason why can't use non-generic base class?

public abstract class promiselistenerbase {     public abstract type promisedtype { get; }     public abstract void handleresolution(object value); }  public class promiselistener<t> : promiselistenerbase {     public override type promisedtype     {         { return typeof(t); }     }     public override void handleresolution(object value)     {         t val = (t)value;         this.isresolved(val);     }      public virtual void isresolved(t value) { /* logic */ }     public virtual void isspoiled() { /* logic */ } }  public class floatlistener : promiselistener<float> {     public override void isresolved(float value)     {         console.out.writeline("floatlistener value {0}", value);     } }  public class intlistener : promiselistener<int> {     public override void isresolved(int value)     {         console.out.writeline("intlistener value {0}", value);     } }  public class somethingusingpromiselisteners {     public void somemethod()     {         dictionary<string, promiselistenerbase> listeners =             new dictionary<string, promiselistenerbase>();         listeners.add("float", new floatlistener());         listeners.add("int", new intlistener());         int somevalue = 123;         foreach (promiselistenerbase listener in listeners.values)         {             if (listener.promisedtype == somevalue.gettype())             {                 listener.handleresolution(somevalue);             }         }     } } 

Comments

Popular posts from this blog

c++ - How to add Crypto++ library to Qt project -

jQuery Mobile app not scrolling in Firefox -

How to use vim as editor in Matlab GUI -