从C#中的字符串名称获取Class对象

Hus*_*Rad 3 c# reflection xamarin.ios xamarin.android

我正在使用C#开发移动应用程序(Monotouch,monodroid).我有一个这个定义的类:

public class TempIOAddOn : BaseIOAddOn 
{
    public TempIOAddOn ()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用此代码通过其字符串名称访问类的实例:

BaseIOAddOn tempIOAddOn;
            Type t= Type.GetType("TempIOAddOn" );
            tempIOAddOn  = (BaseIOAddOn)Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)

但是在执行之后,t是null.

我也试过下面的代码:

BaseIOAddOn tempIOAddOn;
            tempIOAddOn = (BaseIOAddOn )System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("TempIOAddOn" );
Run Code Online (Sandbox Code Playgroud)

但我再次面对null.tempIOAddOn是null.

我是怎么了?

das*_*ght 8

您的类几乎肯定包含在命名空间中.在这种情况下,您需要使用其命名空间限定类型的名称:

Type t= Type.GetType("MyNamespace.TempIOAddOn");
Run Code Online (Sandbox Code Playgroud)


Chr*_*air 5

请尝试使用程序集限定名称.如果它正在运行Xamarin,则可能需要使用完全限定名称.我对Silverlight有同样的限制.

要快速获取全名,只需引用类型并输出它:

Console.WriteLine(typeof(TempIOAddon).AssemblyQualifiedName);
Run Code Online (Sandbox Code Playgroud)

编辑:这是Type.GetType(string)Silverlight 的MSDN文档.由于Xamarin的移动平台或多或少基于它,通常可以应用文档:http://msdn.microsoft.com/en-us/library/w3f99sx1%28v=vs.95%29.aspx

请注意,如果类型在当前正在执行的程序集中,您可能只需要完整的namespace.name