none
反射用法請教 RRS feed

  • 一般討論

  • class Program
        {
            static void Main(string[] args)
            {
                MyClass m = new MyClass();
                m.Set();
            }
        }
    
        class clsVelocity
        {
            public double MinValue = 0;
            public double MaxValue = 0;
        }
    
        class MyClass
        {
    
            public clsVelocity Vel1 = new clsVelocity();
            public clsVelocity Vel2 = new clsVelocity();
    
    
    
            public void Set()
            {
               FieldInfo fi = this.GetType().GetField("Vel1");
                
            }

    請教各位, 在 Myclass. set 中取得 Vel1 後, 如何用反射的方式, 再針對 Vel1.Max 賦值?

    2018年5月9日 下午 04:49

所有回覆

  • public void Set()
    {
        FieldInfo fi = Vel1.GetType().GetField("MaxValue");
        fi.SetValue(Vel1, 5);
    }

    這是你要的效果嗎?

    希望有幫上忙~

    2018年5月9日 下午 05:03
  • 對不起, 我沒描述清楚

    MyClassA 及 MyClassB 是由 BaseClass 繼承而來, 實際的專案中會有 10多個Class 繼承 BaseClass , 所以想把 Set Functin 提取到父類別用反射的方式去查找子類別實體中的成員以減少程式的撰寫, 但是找不到方法去針對類別成員 clsVelocity
    作存取, 不知是我對反射用法認識不深, 還是有更好的方式, 所以向各位請教


    class Program
        {
            static void Main(string[] args)
            {
                MyClassA m1 = new MyClassA();
                m1.Set("Vel1", 1, 10);
                m1.Set("Vel2", 2, 10);
    
                MyClassA m2 = new MyClassA();
                m1.Set("Vel1", 1, 10);
                m1.Set("Vel2", 1, 20);
                m1.Set("Vel3", 1, 30);
            }
        }
    
        class clsVelocity
        {
            public double MinValue = 0;
            public double MaxValue = 0;
        }
    
        class BaseClass
        {
            public void Set(string Name, double _MinValue, double _MaxValue)
            {
                FieldInfo fi = this.GetType().GetField(Name);
            }
        
        }
        class MyClassA : BaseClass
        {
    
            public clsVelocity Vel1 = new clsVelocity();
            public clsVelocity Vel2 = new clsVelocity();
    
        }
    
        class MyClassB : BaseClass
        {
    
            public clsVelocity Vel1 = new clsVelocity();
            public clsVelocity Vel2 = new clsVelocity();
            public clsVelocity Vel3 = new clsVelocity();
        }



    2018年5月15日 下午 03:13
  • 你的這種設計作法很怪,因為父類別不可能知道子類別有什麼東西,除非子類別告訴父類別,或是你把你父類別的 Set() 以 abstract 的方式要子類別覆寫做事,子類別就可以用反射對自己的 field 做操控,那上面的方法才會有效。

    不過如果用子類別覆寫的作法,大概你也不需要用反射了吧。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2018年5月15日 下午 03:31
    版主
  • 的確, Set(..) 的再進一步的要寫的是依照傳入的參數去開啓自已的INI檔, 再用 FOREACH 到的 field 當作key去查找設定值, 所以父類別不用知道子類的內容
    2018年5月15日 下午 03:58
  • 所以變更一下設計或許就能解決你的問題了,就我從程式碼看來應該不太需要用到反射,讓子物件自己做應該做的事就好,父物件不宜管太多。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2018年5月15日 下午 11:39
    版主
  • public void Set(string Name, double _MinValue, double _MaxValue)


    我其實不太懂, 為什麼這個 Set 會有 MinValue 和 MaxValue ? 而且一定是 double ?

    設計這類的東西,應該從需求面出發,也就是說,你要釐清的是整個流程倒底是要做甚麼?而不是技巧上的問題,從技巧上去思考,常常都會過度設計。

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/



    2018年5月16日 上午 04:46
    版主