我正在尝试将GetType方法用于我的自定义类。我将类的名称作为字符串,我想动态获取它的类型。我对两个位于不同目录中的不同类具有相同的名称。
例如:
Folder1中的MyClass.cs:
namespace ConsoleApplication1.Folder1
{
public class MyClass : IClass
{
public void PrintMe()
{
System.Console.WriteLine("I am Folder 1 Class");
}
}
}
Folder2中的MyClass.cs:
namespace ConsoleApplication1.Folder2
{
public class MyClass : IClass
{
public void PrintMe()
{
System.Console.WriteLine("I am Folder 2 Class");
}
}
}
命名空间是ConsoleApplication1
具有相同名称的不同类位于Folder1和Folder2中。
我想从这样的字符串中获取它的类型:
var runtimeString = "Folder1.MyClass"
MSDN中提到的方法名为GetType(string fileName)
如何获取文件的类型并从serviceLocator解析它,类型为运行时类型:
var typeOfMyClass = GetType(runtimeString);
var instanceOfMyClass = ServiceLocator.Resolve<TypeOfMyClass>();
答案 0 :(得分:1)
您似乎在描述对工厂方法的需求,类似于:
public class MyClassFactory : IMyClassFactory
{
private Dictionary<string, Action<IClass>> _factory =
new Dictionary<string, Action<IClass>>
{
["Folder1.MyClass"] = () => new ConsoleApplication1.Folder1.MyClass(),
["Folder2.MyClass"] = () => new ConsoleApplication1.Folder2.MyClass(),
...
};
public IClass GetClassInstance(string myClassName)
{
if (_factory.Contains(myClassName))
{
return _factory[myClassName]();
}
throw NoSuchClassException(myClassName);
}
}
答案 1 :(得分:1)
我相信以下是您要完成的任务:
static void Main(string[] args)
{
var runtimeString = "Folder1.MyClass";
IClass instanceOfMyClass = (IClass)CreateInstance(runtimeString);
instanceOfMyClass.PrintMe();
Console.ReadKey();
}
private static object CreateInstance(string className)
{
var type = Assembly.GetExecutingAssembly().GetTypes()
.First(t => t.FullName.EndsWith(className));
return Activator.CreateInstance(type);
}
答案 2 :(得分:0)
您可以使用Activator.CreateInstance()方法从其名称字符串创建类的对象,如下所示。
创建Type对象:
Type type1 = typeof(MyClass);
或
Type type1 = Type.GetType("MyClass");
创建该类型的实例:
Object o = Activator.CreateInstance(type1);