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

2022-09-04 08:23:18

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

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

MyClass x = (MyClass) Class.forName("classes.MyChildClass").newInstance();

答案 1

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


答案 2

简单示例:

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());
            }
        }
    }
}

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

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

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

    interface ISixty
    {
        DateTime SixtyDaysFromNow();
    }

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

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

这样,你的应用(激活应用)在编译时不需要显式了解或引用其他程序集。