关于C#反射,根据类名创建对象。详情入内

时间:2021-01-15 05:32:07
我的想法是我写一个类,做一些事情。 如果出问题就弹出提示框。这个提示框由别人做,但是由我这个类通过反射来创建。

提示框框中的提示语也由我的这个类产生,在通过反射创建时,提示语作为参数传入那个类

网上的内容看不懂,谁有相关麻烦把代码大致写一下,谢谢!!

12 个解决方案

#1


直接用异常捕获不就可以了?
try
{
    你调用的某个类的某个方法();
}
catch(Exception ex)
{
    //
}

#2


定义一个类:
namespace Example
{
public class ExampleClass
{
 public int iID = 0;
 public string strName = "";
 public ExampleClass()
 {
  iID = 1;
  strName = "Example"; 
 }

 public ExampleClass(int ID,string Name)
 {
  iID = ID;
  strName = Name; 
 }
}
}


实例化对象:需要引用 useing System.Reflection;
//通过类名获取类的类型
Type tp = Type.GetType("Example.ExampleClass");  //需要带上名字空间

//不带参数的情况--------------------
//获取类的初始化参数信息
ConstructorInfo ct1 = tp.GetConstructor(System.Type.EmptyTypes);
//调用不带参数的构造器
ExampleClass Ex1 = (ExampleClass)ct1.Invoke(null);
MessageBox.Show("ID = " + Ex1.iID.ToString() + "; Name = " + Ex1.strName);
//将输出: ID = 1; Name = Example

//带参数的情况
//定义参数类型数组
Type[] tps = new Type[2];
tps[0] = typeof(int);
tps[1] = typeof(string);
//获取类的初始化参数信息
ConstructorInfo ct2 = tp.GetConstructor(tps);

//定义参数数组
object[] obj = new object[2];
obj[0] = (object)100;
obj[1] = (object)"Param Example";

//调用带参数的构造器
ExampleClass Ex2 = (ExampleClass)ct2.Invoke(obj);
MessageBox.Show("ID = " + Ex2.iID.ToString() + "; Name = " + Ex2.strName);
//将输出: ID = 100; Name = Param Example

#3


该回复于2010-11-02 10:20:29被版主删除

#4


楼上的楼上正解

#5


该回复于2010-11-02 10:20:30被版主删除

#6


学习''''

#7


楼上的是正解 但 直接实例化该类 直接调用方法不行吗? 好像这边用反射没多大意义吧

#8


该回复于2010-11-02 14:26:06被版主删除

#9


不要滥用反射。

其实语言往往是混沌的,其实只要你把你的需求重新用接口、用代码来描述出来(不需要什么“伪代码”,就是真实的代码,基于接口来多态地隐藏接口的具体实现即可),那么接下来的实现思路就快清楚了。

#10


我许多时候发现:只是帮那些只会动嘴不会动手的人把需求用代码写出来,然后他们自己就会实现了。而我并不需要替他实现。

#11


楼主你的需求我怎么看都应该用委托来实现,你提供信息如何显示让调用方来实现


delegate void ShowMessage(string message);

    /// <summary>
    ///  你的类
    /// </summary>
    class A
    {
        public event ShowMessage showHandle;

        public void exec()
        {
            if (showHandle != null)
                showHandle("你要显示的内容");
        }
    }

    /// <summary>
    /// 用户的类
    /// </summary>
    class B
    {
        A test = new A();
        public B()
        {
            test.showHandle +=new ShowMessage(test_showHandle);
        }

        void test_showHandle(string message)
        {
            // 具体的显示
        }
    }

#12


反射,查查资料就知道了。

#1


直接用异常捕获不就可以了?
try
{
    你调用的某个类的某个方法();
}
catch(Exception ex)
{
    //
}

#2


定义一个类:
namespace Example
{
public class ExampleClass
{
 public int iID = 0;
 public string strName = "";
 public ExampleClass()
 {
  iID = 1;
  strName = "Example"; 
 }

 public ExampleClass(int ID,string Name)
 {
  iID = ID;
  strName = Name; 
 }
}
}


实例化对象:需要引用 useing System.Reflection;
//通过类名获取类的类型
Type tp = Type.GetType("Example.ExampleClass");  //需要带上名字空间

//不带参数的情况--------------------
//获取类的初始化参数信息
ConstructorInfo ct1 = tp.GetConstructor(System.Type.EmptyTypes);
//调用不带参数的构造器
ExampleClass Ex1 = (ExampleClass)ct1.Invoke(null);
MessageBox.Show("ID = " + Ex1.iID.ToString() + "; Name = " + Ex1.strName);
//将输出: ID = 1; Name = Example

//带参数的情况
//定义参数类型数组
Type[] tps = new Type[2];
tps[0] = typeof(int);
tps[1] = typeof(string);
//获取类的初始化参数信息
ConstructorInfo ct2 = tp.GetConstructor(tps);

//定义参数数组
object[] obj = new object[2];
obj[0] = (object)100;
obj[1] = (object)"Param Example";

//调用带参数的构造器
ExampleClass Ex2 = (ExampleClass)ct2.Invoke(obj);
MessageBox.Show("ID = " + Ex2.iID.ToString() + "; Name = " + Ex2.strName);
//将输出: ID = 100; Name = Param Example

#3


该回复于2010-11-02 10:20:29被版主删除

#4


楼上的楼上正解

#5


该回复于2010-11-02 10:20:30被版主删除

#6


学习''''

#7


楼上的是正解 但 直接实例化该类 直接调用方法不行吗? 好像这边用反射没多大意义吧

#8


该回复于2010-11-02 14:26:06被版主删除

#9


不要滥用反射。

其实语言往往是混沌的,其实只要你把你的需求重新用接口、用代码来描述出来(不需要什么“伪代码”,就是真实的代码,基于接口来多态地隐藏接口的具体实现即可),那么接下来的实现思路就快清楚了。

#10


我许多时候发现:只是帮那些只会动嘴不会动手的人把需求用代码写出来,然后他们自己就会实现了。而我并不需要替他实现。

#11


楼主你的需求我怎么看都应该用委托来实现,你提供信息如何显示让调用方来实现


delegate void ShowMessage(string message);

    /// <summary>
    ///  你的类
    /// </summary>
    class A
    {
        public event ShowMessage showHandle;

        public void exec()
        {
            if (showHandle != null)
                showHandle("你要显示的内容");
        }
    }

    /// <summary>
    /// 用户的类
    /// </summary>
    class B
    {
        A test = new A();
        public B()
        {
            test.showHandle +=new ShowMessage(test_showHandle);
        }

        void test_showHandle(string message)
        {
            // 具体的显示
        }
    }

#12


反射,查查资料就知道了。