code_junkie

Casting an object to a generic interface

Nov 11th, 2011
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. internal interface IRelativeTo<T> where T : IObject
  2. {
  3. T getRelativeTo();
  4. void setRelativeTo(T relativeTo);
  5. }
  6.  
  7. public class AdminRateShift : IObject, IRelativeTo<AdminRateShift>
  8. {
  9. AdminRateShift getRelativeTo();
  10. void setRelativeTo(AdminRateShift shift);
  11. }
  12.  
  13. IRelativeTo<>
  14. IRelativeTo<AdminRateShift>
  15. IRelativeTo<IObject>
  16.  
  17. IRelativeTo<IObject> = getObjectThatImplementsRelativeTo(); // returns Object
  18.  
  19. internal interface IRelativeTo
  20. {
  21. object getRelativeTo(); // or maybe something else non-generic
  22. void setRelativeTo(object relativeTo);
  23. }
  24. internal interface IRelativeTo<T> : IRelativeTo
  25. where T : IObject
  26. {
  27. new T getRelativeTo();
  28. new void setRelativeTo(T relativeTo);
  29. }
  30.  
  31. void DoSomething<T>() where T : IObject
  32. {
  33. IRelativeTo<IObject> foo = // etc
  34. }
  35.  
  36. DoSomething(foo);
  37.  
  38. DoSomething<SomeType>(foo);
  39.  
  40. void MyFunction<T>(IRelativeTo<T> sth) where T : IObject
  41. {}
  42.  
  43. interface IRelativeTo
  44. {
  45. IObject getRelativeTo();
  46. void setRelativeTo(IObject relativeTo)
  47. }
  48.  
  49. abstract class RelativeTo<T> : IRelativeTo where T : IObject
  50. {
  51. public virtual T getRelativeTo() {return default(T);}
  52.  
  53. public virtual void setRelativeTo(T relativeTo) {}
  54.  
  55. IObject IRelativeTo.getRelativeTo() {return this.getRelativeTo(); }
  56.  
  57. void IRelativeTo.setRelativeTo(IObject relativeTo)
  58. { this.setRelativeTo((T) relativeTo);
  59. }
  60. }
  61.  
  62. class AdminRateShift : RelativeTo<AdminRateShift>, IObject {}
  63.  
  64. IRelativeTo irt = new AdminRateShift();
  65. IObject o = irt.getRelativeTo();
  66. irt.setRelativeTo(o);
Add Comment
Please, Sign In to add comment