我们可以在运行时创建一个类的实例并通过代码调用该类的所有方法吗?

Vij*_*dra 4 c# asp.net reflection

在一次采访中,Interviwer问我是否 可以在运行时创建类的实例并通过代码调用类的所有方法? 下面是类TestClass的示例代码

public class TestClass
{
    public int ID
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
    public float Salary
    {
        get;
        set;
    }
    public string Department
    {
        get;
        set;
    }
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Sub(int a, int b)
    {
        return a - b;
    }
}//end class
Run Code Online (Sandbox Code Playgroud)

现在,我想在运行时创建此类的实例,并在运行时调用其所有方法和属性,请问有人可以解释如何对此进行归档。2.这样调用方法的好处/用途是什么?

Dan*_*rth 5

我想他是在问反思。这里和谷歌上都有大量关于这个主题的信息。
基本上,您想要这样做的原因是,您在编译时不知道具体类型,需要在运行时动态找到它。
一个例子是一个简单的插件系统,你需要插件来实现某个接口。在运行时,您加载指定文件夹中的所有程序集,并使用反射搜索实现接口的类,然后创建该类的实例并在其上调用方法。


use*_*016 5

是的,有可能。

要创建实例,请使用:

Type classType = Type.GetType("TestClass");
object instance = Activator.CreateInstance(classType);
Run Code Online (Sandbox Code Playgroud)

然后调用Sub(23, 42)instance的样子:

classType.InvokeMember("Sub", BindingFlags.InvokeMethod, null, instance, new object[] { 23, 42 });
Run Code Online (Sandbox Code Playgroud)

例如,当您在编译时不知道类型并希望在运行时发现它们时(例如在外部dll,插件等中),将使用反射。