zoukankan      html  css  js  c++  java
  • (论坛答疑点滴)如何按照HashTable动态设定类的属性和字段?

    正好有人问这个,代码非常简单,最基本的应用,直接贴代码

    using System;

    namespace Test
    {
        
    /// <summary>
        
    /// Class1 的摘要说明。
        
    /// </summary>

        class Class1
        
    {
            
    /// <summary>
            
    /// 应用程序的主入口点。
            
    /// </summary>

            [STAThread]
            
    static void Main(string[] args)
            
    {
                
    //
                
    // TODO: 在此处添加代码以启动应用程序
                
    //
                MyFieldClass dv=new MyFieldClass();
                System.Collections.Hashtable ht1
    =new System.Collections.Hashtable();
                ht1.Add(
    "FieldA","A");
                ht1.Add(
    "FieldC","C");
                SetField1(ht1,dv);
    //如果类中的字段匹配Hashtable中的Key则重新设定
                
    //SetField2(ht1,dv)//如果Hashtable中的Key匹配类中的字段则重新设定,效果等同于SetField1
                Console.WriteLine(dv.FieldA);//A
                Console.WriteLine(dv.FieldB);//bb
                Console.WriteLine(dv.FieldC);//C
                System.Collections.Hashtable ht2=new System.Collections.Hashtable();
                ht2.Add(
    "PropertyB","b");
                ht2.Add(
    "PropertyC","c");
                SetProperty1(ht2,dv);
    //如果类中的属性匹配Hashtable中的Key则重新设定
                
    //SetProperty2(ht2,dv);//如果Hashtable中的Key匹配类中的属性则重新设定,效果等同于SetProperty1
                Console.WriteLine(dv.FieldA);//A
                Console.WriteLine(dv.FieldB);//b
                Console.WriteLine(dv.FieldC);//c
                
            }


            
    public static void SetProperty1(System.Collections.Hashtable ht1,MyFieldClass dv)
            
    {
                
    foreach(System.Collections.DictionaryEntry de in ht1)
                
    {
                    System.Reflection.PropertyInfo pi
    =dv.GetType().GetProperty(de.Key.ToString());
                    
    if(pi!=null)pi.SetValue(dv,de.Value.ToString(),null);
                }

            }


            
    public static void SetProperty2(System.Collections.Hashtable ht1,MyFieldClass dv)
            
    {
                
    foreach(System.Reflection.PropertyInfo pi in dv.GetType().GetProperties())
                
    {
                    
    if(ht1.Contains(pi.Name))pi.SetValue(dv,ht1[pi.Name],null);
                }

            }


            
    public static void SetField1(System.Collections.Hashtable ht2,MyFieldClass dv)
            
    {
                
    foreach(System.Collections.DictionaryEntry de in ht2)
                
    {
                    System.Reflection.FieldInfo fi
    =dv.GetType().GetField(de.Key.ToString());
                    
    if(fi!=null)fi.SetValue(dv,de.Value.ToString());
                }

            }


            
    public static void SetField2(System.Collections.Hashtable ht2,MyFieldClass dv)
            
    {
                
    foreach(System.Reflection.FieldInfo fi in dv.GetType().GetFields())
                
    {
                    
    if(ht2.Contains(fi.Name))fi.SetValue(dv,ht2[fi.Name]);
                }

            }

        }


        
    public class MyFieldClass
        
    {
            
    public string FieldA="aa";
            
    public string FieldB="bb";
            
    public string FieldC="cc";

            
    public string PropertyA
            
    {
                
    get
                
    {
                    
    return FieldA;
                }

                
    set
                
    {
                    FieldA
    =value;
                }

            }


            
    public string PropertyB
            
    {
                
    get
                
    {
                    
    return FieldB;
                }

                
    set
                
    {
                    FieldB
    =value;
                }

            }


            
    public string PropertyC
            
    {
                
    get
                
    {
                    
    return FieldC;
                }

                
    set
                
    {
                    FieldC
    =value;
                }

            }

        }


    }

    欢迎大家阅读我的极客时间专栏《Java业务开发常见错误100例》【全面避坑+最佳实践=健壮代码】
  • 相关阅读:
    Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task(枚举/最大连续子序列)
    Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
    Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)
    Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)
    Codeforces Round #644 (Div. 3)
    Educational Codeforces Round 76 (Rated for Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    Educational Codeforces Round 87 (Rated for Div. 2)
    AtCoder Beginner Contest 168
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/lovecherry/p/146461.html
Copyright © 2011-2022 走看看