Как получить экземпляр класса по названию класса? - PullRequest
4 голосов
/ 12 марта 2011

Я видел эту тему: Создание экземпляра из имени класса

и запись этого кода:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        object obj = Activator.CreateInstance(null, "MyClass");

        MyClass t = (MyClass)obj;
        t.My1 = 100;
        MessageBox.Show(t.My1.ToString());
    }
}

public class MyClass
{
    public int My1 { get; set; }
    public int My2 { get; set; }
}

Однако при его запуске возникает исключение:

Could not load type 'MyClass' from assembly 'Test_Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

У меня есть еще один вопрос.У меня есть класс в одной сборке, которая имеет некоторые свойства.В другой сборке я хочу создать его экземпляр и получить доступ к его свойствам, набрав один из них, используя строковое имя класса.Как я могу это сделать?

Ответы [ 2 ]

11 голосов
/ 12 марта 2011

Согласно MSDN null на самом деле не означает текущая сборка .Это означает, что сборка будет найдена (важно, когда ваш класс находится в другой сборке).Также вам нужно указать не только название класса.Таким образом, чтобы предотвратить поиск и правильно ввести тип, вам нужно написать полное имя, соответствующее сборке :

Type objType = Type.GetType("YourNamespace.MyClass, YourAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
object obj = Activator.CreateInstance(objType);
MyClass t = (MyClass)obj;

Имя, соответствующее сборке, которое можно получить, например, с помощью следующего кода (чтобы проверить, чтоВы не ошиблись):

string name = typeof(MyClass).AssemblyQualifiedName;
2 голосов
/ 12 марта 2011

Вам просто нужно добавить пространство имен к имени класса.В консольном проекте exe это работает для меня.У вас была проблема с тем, как вы использовали возвращаемый дескриптор объекта.Это не Object, а ObjectHandle, и вам нужно вызвать Unwrap() get для фактического экземпляра типа.

namespace CSharpConsoleTest
{
    public class MyClass
    {
        public int My1 { get; set; }
        public int My2 { get; set; }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            var obj = Activator.CreateInstance(null, "CSharpConsoleTest.MyClass");

            var t = (MyClass)obj.Unwrap();
            t.My1 = 100;
            MessageBox.Show(t.My1.ToString());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...