Class.forName() 在 .NET 中等效?
2022-09-04 08:23:18
动态获取对象类型然后创建其新实例的 C# 方法是什么?
例如,我如何完成以下Java代码的结果,但是在C#中:
MyClass x = (MyClass) Class.forName("classes.MyChildClass").newInstance();
动态获取对象类型然后创建其新实例的 C# 方法是什么?
例如,我如何完成以下Java代码的结果,但是在C#中:
MyClass x = (MyClass) Class.forName("classes.MyChildClass").newInstance();
简单示例:
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()
要从其他程序集加载,您需要使用接受类型的重载,而不是类型名称;获取给定类型名称的类型的一种方法是使用 ,指定程序集限定的名称。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);
}
}
和
var x = Activator.CreateInstance(null, "Your.Namespace.Foo");
ISixty f = (ISixty) x.Unwrap();
Console.WriteLine("Sixty days from now: {0}", f.SixtyDaysFromNow().ToString("G"));
这样,你的应用(激活应用)在编译时不需要显式了解或引用其他程序集。