如何从字符串c#获取自定义类的类型

时间:2016-09-28 11:41:21

标签: c# parsing reflection service

我正在尝试将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>(); 

3 个答案:

答案 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);