zoukankan      html  css  js  c++  java
  • 用Activator.CreatInstance动态的创建同一个Assembly的对象

    在正常的工厂类中,我们会有很多的switch case之类的,如何避免他们,我们可以利用.Net的Activator帮我们简单的完成这件事情。目前,经过简单大测试,支持public的构造函数,internal private的都还没有仔细看因为我关心的是public的构造函数。
      研究这个的起因在于,我想用基于配置文件的形式来动态的创建DataAccess对象。
      主要是由于我的构造函数参数是一个自定义的类,不是系统的基本数据类型。昨天测试的时候不知道怎么回事发生了问题,所以,今天早上才写了如下的测试代码,发觉真的很喜欢Snippet Compiler
    using System;
    using System.Reflection;
    using System.Collections;
    namespace FishSky.Testing
    {
    public class DesireSay
    {
       
    public DesireSay()
       
    {
       }

       
    private string mWords;
       
    public string Words
       
    {
         
    getreturn mWords;}
         
    set{ mWords=value;}
       }
       
    }

    public class SayHello
    {
        
    private string mIWannaSay="";
        
    private DesireSay mDesireSay;
        
    private int mInternalInt=-1;
        
    public SayHello()
        
    {
        }

        
    public SayHello(string iWannaSay)
        
    {
           mIWannaSay
    =iWannaSay;
        }

        
    public SayHello(DesireSay desireSay)
        
    {
          mDesireSay
    =desireSay;
        }

        
    internal SayHello(int internalInt)
        
    {
          mInternalInt
    =internalInt;
        }

        
    public string Hello()
        
    {
            
    if(mInternalInt!=-1)
            
    {
               
    return mInternalInt.ToString();
            }

            
    else
            
    {
                
    if(mDesireSay!=null)
                
    {
                
    return mDesireSay.Words;
                }

                
    else
                
    {
                    
    if(mIWannaSay=="")
                        
    return "Hello";
                    
    else
                        
    return mIWannaSay;
                }

            }

        }

        
    }

    public class MyClass
    {
        
    public static void Main()
        
    {
            
    string TypeName="FishSky.Testing.SayHello";
            Type type
    =Type.GetType(TypeName,true);
            SayHello hello
    =(SayHello) Activator.CreateInstance(type);
            WL(
    "SayHello says {0}",hello.Hello());
            Console.WriteLine(
    "Next Test with string parameter in constructor..");
            SayHello hello2
    =(SayHello) Activator.CreateInstance(type,new Object[]{"I wanna say Hello!"});
            WL(
    "SayHello says {0}",hello2.Hello());
            Console.WriteLine(
    "Next Test with Class parameter in constructor..");
            DesireSay desireSay
    =new DesireSay();
            desireSay.Words
    ="I Desire say!Let me say!";
            SayHello hello3
    =(SayHello) Activator.CreateInstance(type,new Object[]{desireSay});
            WL(
    "SayHello says {0}",hello3.Hello());
    //        Console.WriteLine("Next Test with int parameter in internal constructor..");
    //        SayHello hello4=(SayHello) Activator.CreateInstance(type,new Object[]{250});
    //        //SayHello hello4=(SayHello)Activator.CreateInstance(type,BindingFlags.NonPublic,null,new object[250],new CultureInfo());
    //        WL("SayHello says {0}",hello4.Hello());        
            RL();
        }

        
        
    Helper methods
    }

    }

  • 相关阅读:
    【java】工厂模式Factory,利用反射改进
    【java】反射简单示例
    【java】java.util.regex.Pattern和java.util.regex.Matcher简单示例
    【java】实现一个简单的正则:判断一个字符串是否全由数字组成
    【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>
    【java】java.util.Arrays类常用方法
    【java】Date与String之间的转换及Calendar类:java.text.SimpleDateFormat、public Date parse(String source) throws ParseException和public final String format(Date date)
    【java】获取当前日期时间:java.util.Date
    44-python-三维画图
    43-python-自己的词典
  • 原文地址:https://www.cnblogs.com/wildfish/p/317060.html
Copyright © 2011-2022 走看看