现已有一个Object类型实例:myobj
有类:MyClass和MyClass2
想通过反射的方式对myobj进行灵活的拆箱操作
比如 (MyClass)myobj或者(MyClass1)myobj
应该怎么写?
public void GetIt(string str_ClassName)
{
    Object myobj = new Object();
    如何通过str_ClassName对myobj进行拆箱操作?
    
}

解决方案 »

  1.   

    >现已有一个Object类型实例:myobj
    这个用不着反射, 这样:
    MyClass myClass = myobj as MyClass;>public void GetIt(string str_ClassName)
    >{
    >    Object myobj = new Object();
    >    如何通过str_ClassName对myobj进行拆箱操作?
    >    
    >}
    你说的很矛盾,刚才说是实例,这边又变成字符串了。这这儿,用不着拆箱操作,而应该用反射:public MyClass GetIt(string str_ClassName)
    {
     Assembly asm = Assembly.Load(....);
     MyClass myClass = asm.CreateInstance("MyClass");
     return myClass;
    }
      

  2.   

    你又不知道是什么类型怎么拆箱呢.一般情况下返回一个Object,然后转换成一个已知的类型.(已知的类型可以是基类或是接口什么的)
      

  3.   


    是我没说清楚我在应用程序中自己定义了两个异常类(属于命名空间WinException)
    public class SqlErrorException :System.ApplicationException {……}
    和public class NotConnectionException:System.ApplicationException {……}程序统一处理异常的时候
            private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
            {  
                if (e.Exception.GetType().Namespace.Equals("WinException"))//如果是WinException命名空间
                {
                    if (e.Exception.GetType().ToString() == "WinException.SqlErrorException")//这个可以获取是哪个异常类(SqlErrorException还是NotConnectionException)
                   {
                        MessageBox.Show(((WinException.SqlErrorException)e.Exception).Message.ToString());
                    }
                    else
                    {
                         MessageBox.Show(((WinException.NotConnectionException)e.Exception).Message.ToString());
                    }
                }
            }现在想用反射对这段代码进行改造,因为以后WinException还会加入更多的自定义异常类,总不能一个个去判断吧
      

  4.   

    TO lidong6(立冬) 
    我已经知道了类型的字符串形式
    比如 string str_classname = "MyClass";
    但是总不能  (str_classname)obj这样来操作吧?
    我觉得反射应该可以解决这个问题,所以特来请教
      

  5.   

    SqlErrorException ,SqlErrorException 都继承接口IShowMsg,里面有showMsg方法 if (e.Exception.GetType().Namespace.Equals("WinException"))//如果是WinException命名空间
    {        
     MessageBox.Show(((IShowMsg)e.Exception).ShowMsg());
    }
      

  6.   

    TO feiyun0112(http://feiyun0112.cnblogs.com/) 
    如果在SqlErrorException ,SqlErrorException中也重写了showMsg方法,MessageBox.Show(((IShowMsg)e.Exception).ShowMsg());
    这样就不行了吧
      

  7.   

    你可以转换到ApplicationException,因为ApplicationException是他们的基类:
    MessageBox.Show((ApplicationException)GetIT("yourclassname")).Message.ToString());
      

  8.   

    虽然是继承了ApplicationException,但是在他们各自的方法中也重写了Message属性public class NotConnectionException:System.ApplicationException 
        { 
            /**//// <summary> 
            /// 抛出的错误信息 
            /// </summary> 
            string _mess; 
            public new string Message 
            { 
                get 
                { 
                    return _mess; 
                } 
            } 
            public NotConnectionException(string mess) 
            { 
                _mess = mess; 
            } 
            public NotConnectionException(){} 
        }
      

  9.   

    这种问题用反射来弄实在是有点儿太那个了吧。你不要用覆盖,直接重写就是
    Message属性本来就是virtual的。        public override string Message 
            { 
                get 
                { 
                    return _mess; 
                } 
            } 况且你可以重写构造函数把Message传进去。
      

  10.   

    重写了Message属性也没事,他会调用你重写的Message属性,你可以试一下