ASP.Net使用法シリーズ:ベースクラスからLINQ/EFクラスのプロパティを呼び出す方法


例えばDogs/Cats/Cows/...、いずれも異なるAgeメソッドがあり、そのベースクラスから同じメソッドShowAgeでこれらの異なるAgeを表示するには、ベースクラスAnimalのvirtual関数を借りることができます.たとえば、次のようにします.

  
  
  
  
  1.  
  2. [csharp] view plaincopy  
  3. 01.public class Animal    
  4. 02.{    
  5. 03.    public virtual Age    
  6. 04.    {    
  7. 05.        get {....}    
  8. 06.        set {....}    
  9. 07.    }    
  10. 08.    public ShowAge()    
  11. 09.    {    
  12. 10.        Show(Age);    
  13. 11.    }    
  14. 12.}    
  15. 13.    
  16. 14.public class Dog : Animal    
  17. 15.{    
  18. 16.    public override Age    
  19. 17.    {    
  20. 18.        get {...}    
  21. 19.        set {...}    
  22. 20.    }    
  23. 21.}    
  24. 22.public class Cat : Animal    
  25. 23.{    
  26. 24.    public override Age    
  27. 25.    {    
  28. 26.        get {...}    
  29. 27.        set {...}    
  30. 28.    }    

overrideはoverrideがなければanimalが自分のAgeを呼び出すため、重要です.DogとCatがLINQ/EFで自動的に生成されるクラスであれば、overrideというキーワードがなければ、このような状況が発生します.
もちろんLINQ/EFで生成されるコードに毎回手で加えることはできませんが、どうすればいいですか?
前回この問題に遭遇して、検索してはいけなくて、半日テストして1つの方法を見つけて、今日再び使って、珍しく投稿して共有するとは言えません.
Animalでは、これらのコードを使用します.

  
  
  
  
  1.  
  2. [csharp] view plaincopy  
  3. 01.public virtual int Age    
  4. 02.{      
  5. 03.    get     
  6. 04.    {     
  7. 05.        PropertyInfo pi = this.GetType().GetProperty("Age");     
  8. 06.        int age = (int)pi.GetValue(this, new object[] {});     
  9. 07.        return age;     
  10. 08.    }     
  11. 09.    set     
  12. 10.    {     
  13. 11.        PropertyInfo pi = this.GetType().GetProperty("Age");     
  14. 12.        pi.SetValue(this, value, new object[] { });     
  15. 13.    }     
  16. 14.}     

この方法は実は「継承」とはあまり関係なく、純粋にデータベーステーブルの属性を直接読み取って、応急措置をとることができます.