我看过这个主题:Creating an instance from a class name
并编写此代码:
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'.
我有另一个问题。我在一个集合中有一个类,它有一些属性。在另一个程序集中,我想创建它的实例并通过使用stringy Class Name键入其中一个属性来访问它的属性。我怎么能这样做?
答案 0 :(得分:11)
根据MSDN null
实际上并不意味着当前汇编。这意味着将搜索程序集(当您的类位于另一个程序集中时就是这个问题)。此外,您不仅需要指定类名。因此,为了防止搜索并正确获取类型,您需要编写完整的assembly-qualified name:
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;
答案 1 :(得分:2)
您只需要将名称空间添加到类名称中。在一个控制台exe项目中,这对我有用。您确实遇到了使用返回的对象句柄的方式的问题。它不是Object
,而是ObjectHandle
,您需要调用Unwrap()
获取实际的类型实例。
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());
}
}
}