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

本文关键字:自定义 类型 字符串 | 更新日期: 2023-09-27 18:09:08

我试图使用GetType方法为我的自定义类。我有类的名称作为字符串,我想动态地获得它的类型。我给两个不同的类取了相同的名字,它们位于不同的目录下。

例如:

MyClass.cs in Folder1:

namespace ConsoleApplication1.Folder1
{
    public class MyClass : IClass
    {
        public void PrintMe()
        {
            System.Console.WriteLine("I am Folder 1 Class");
        }
    }
}

MyClass.cs in Folder2:

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>(); 

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

您似乎是在描述对工厂方法的需求,类似于:

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);
    }
} 

我相信以下就是你想要达到的目标:

    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);
    }

您可以使用Activator.CreateInstance()方法从类的名称字符串创建一个对象,如下所示。

创建Type对象:
Type type1 = typeof(MyClass);

Type type1 = Type.GetType("MyClass");

创建该类型的实例:

Object o = Activator.CreateInstance(type1);