2013-04-27 3 views
3

Я использую C# для разработки мобильных приложений (Monotouch, monodroid). У меня есть класс по этому определению:Получение объекта класса из его строкового имени в C#

public class TempIOAddOn : BaseIOAddOn 
{ 
    public TempIOAddOn() 
    { 
    } 
} 

И я использую этот код, чтобы получить доступ к экземпляру класса по имени строки:

BaseIOAddOn tempIOAddOn; 
      Type t= Type.GetType("TempIOAddOn"); 
      tempIOAddOn = (BaseIOAddOn)Activator.CreateInstance(t); 

Но после того, как executation, t является null.

Я попытался ниже код также:

BaseIOAddOn tempIOAddOn; 
      tempIOAddOn = (BaseIOAddOn)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("TempIOAddOn"); 

Но снова я сталкиваюсь с null. tempIOAddOn - null.

Что случилось со мной?

+2

Попробуйте использовать [Собрание Qualified Name] (http://msdn.microsoft.com/en-us/library/system.type .assemblyqualifiedname.aspx). Если он запускает Xamarin, ему необходимо указать полное имя. У меня были те же ограничения с Silverlight. –

+0

Возможный дубликат [Получение типа System.Type из частичного имени типа] (http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial-name) ** и ** [type-gettypenamespace-ab-classname-returns-null] (http://stackoverflow.com/questions/1825147/type-gettypenamespace-ab-classname-returns-null) – nawfal

ответ

5

Попробуйте использовать вместо этого Assembly Qualified Name. Если вы используете Xamarin, то может использовать полное квалифицированное имя. У меня были те же ограничения с Silverlight.

Чтобы быстро получить полное имя, просто ссылаться на тип и выводит его:

Console.WriteLine(typeof(TempIOAddon).AssemblyQualifiedName); 

EDIT: Вот документ MSDN для Type.GetType(string) для Silverlight. Поскольку мобильная платформа Xamarin является более или менее на основе от него, как правило, эти документы могут применяться: http://msdn.microsoft.com/en-us/library/w3f99sx1%28v=vs.95%29.aspx

Обратите внимание, что, вероятно, если тип находится в исполняемой в данный момент сборки, вам, вероятно, нужно только полный namespace.name

+0

Спасибо за ответ, что он работает. –

7

Ваш класс почти наверняка включен в пространство имен. В этом случае вам нужно квалифицировать имя типа с пространством имен:

Type t= Type.GetType("MyNamespace.TempIOAddOn"); 
+0

Спасибо за ответ. оба ответа правильны и просто могут выбрать один в качестве ответа. Вместо этого 1 upvote для четкого ответа. –

Смежные вопросы