.NET中的Class.forName()等效?

mih*_*the 12 c# java reflection

什么是动态获取对象类型然后创建新实例的C#方式?

例如,如何完成以下Java代码的结果,但在C#中:

MyClass x = (MyClass) Class.forName("classes.MyChildClass").newInstance();
Run Code Online (Sandbox Code Playgroud)

Pet*_*hev 8

看看csharp-examples.net/reflection-examples.基本上你必须使用typeof()Activator.createInstance().


Che*_*eso 6

简单的例子:

namespace Your.Namespace
{
    public class Foo
    {
        public DateTime SixtyDaysFromNow()
        {
            return DateTime.Now + new TimeSpan(60,0,0,0);
        }
    }

    public class CreateInstance1
    {
        public static void Main(string[] args)
        {
            try
            {
                var x = Activator.CreateInstance(null, "Your.Namespace.Foo");
                Foo f = (Foo) x.Unwrap();
                Console.WriteLine("Result: {0}", f.SixtyDaysFromNow().ToString("G"));
            }
            catch (System.Exception exc1)
            {
                Console.WriteLine("Exception: {0}", exc1.ToString());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

调用Activator.CreateInstance()指定程序集名称和类名。类名必须是完全限定的(包括所有命名空间)。如果程序集名称为空,则它使用当前正在运行的程序集。如果要激活的类位于当前运行的程序集之外,则需要使用完全限定名称指定程序集。

要从不同的程序集加载,您需要使用接受类型的重载CreateInstance,而不是类型名称;获取给定类型名称的类型的一种方法是使用Type.GetType(),指定程序集限定名称。

大多数情况下Activator.CreateInstance()是使用接口类型完成的,以便可以将创建的实例强制转换为接口,并且您可以在接口类型上调用。像这样:

    interface ISixty
    {
        DateTime SixtyDaysFromNow();
    }

    public class Foo : ISixty
    {
        public DateTime SixtyDaysFromNow()
        {
            return DateTime.Now + new TimeSpan(60,0,0,0);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  var x = Activator.CreateInstance(null, "Your.Namespace.Foo");
  ISixty f = (ISixty) x.Unwrap();
  Console.WriteLine("Sixty days from now: {0}", f.SixtyDaysFromNow().ToString("G"));
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您的应用程序(激活应用程序)不需要在编译时显式地了解或引用其他程序集。


Cod*_*aos 5

这个问题分为两个部分

  1. 如何获得Type对应的名称?
    有时您可以使用Type.GetType(string)。但是除非类型在mscorlib或正在执行的程序集中,否则您需要在名称中指定程序集的名称。

  2. 如何创建给定的类型?
    Activatior.CreateInstance是这部分的答案。

但是在您的代码中您已经知道该类,因为可以将其强制转换为MyClass。所以这个问题没有多大意义。