mih*_*the 12 c# java reflection
什么是动态获取对象类型然后创建新实例的C#方式?
例如,如何完成以下Java代码的结果,但在C#中:
MyClass x = (MyClass) Class.forName("classes.MyChildClass").newInstance();
Run Code Online (Sandbox Code Playgroud)
简单的例子:
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)
通过这种方式,您的应用程序(激活应用程序)不需要在编译时显式地了解或引用其他程序集。
这个问题分为两个部分
如何获得Type对应的名称?
有时您可以使用Type.GetType(string)。但是除非类型在mscorlib或正在执行的程序集中,否则您需要在名称中指定程序集的名称。
如何创建给定的类型?
Activatior.CreateInstance是这部分的答案。
但是在您的代码中您已经知道该类,因为可以将其强制转换为MyClass。所以这个问题没有多大意义。