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

C# 如何从字符串c获取自定义类的类型#,c#,parsing,reflection,service,C#,Parsing,Reflection,Service,我正在尝试为我的自定义类使用GetType方法。我将类的名称设置为字符串,并希望动态获取它的类型。我有两个位于不同目录中的不同类的相同名称 例如: 文件夹1中的MyClass.cs: namespace ConsoleApplication1.Folder1 { public class MyClass : IClass { public void PrintMe() { System.Console.WriteLine("

我正在尝试为我的自定义类使用GetType方法。我将类的名称设置为字符串,并希望动态获取它的类型。我有两个位于不同目录中的不同类的相同名称

例如:

文件夹1中的MyClass.cs:

namespace ConsoleApplication1.Folder1
{
    public class MyClass : IClass
    {
        public void PrintMe()
        {
            System.Console.WriteLine("I am Folder 1 Class");
        }
    }
}
文件夹2中的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" 
命名的GetType(字符串文件名)中提到了一个方法

如何获取文件的类型并从serviceLocator解析该文件,并在运行时将其类型设置为:

var typeOfMyClass = GetType(runtimeString);    
var instanceOfMyClass = ServiceLocator.Resolve<TypeOfMyClass>(); 
var-typeOfMyClass=GetType(runtimeString);
var instanceOfMyClass=ServiceLocator.Resolve();

您似乎描述了对工厂方法的需求,大致如下:

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);
    }
} 
公共类MyClassFactory:IMyClassFactory
{
私人词典工厂=
新词典
{
[“Folder1.MyClass”]=()=>新的控制台应用程序1.Folder1.MyClass(),
[“Folder2.MyClass”]=()=>新的控制台应用程序1.Folder2.MyClass(),
...
};
公共IClass GetClassInstance(字符串myClassName)
{
if(_factory.Contains(myClassName))
{
返回_工厂[myClassName]();
}
抛出NoSuchClassException(myClassName);
}
} 

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

创建类型对象:

Type type1 = typeof(MyClass);

创建该类型的实例:

Object o = Activator.CreateInstance(type1);

我相信以下是您正在努力实现的目标:

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

很难理解为什么需要这么做。示例中两个
MyClass
类的名称空间是
ConsoleApplication1.Folder1
ConsoleApplication1.Folder2
。您似乎希望基于不包含
ConsoleApplication1
部分的字符串创建这些
MyClass
类之一的实例,只需
Folder1.MyClass
Folder2.MyClass
。对吗?我在不同的位置有相同名称的不同类,我想在运行时响应方面使用它们。我还想在同一个变量中使用它们。他们也继承了同样的遗产interface@Filburt像这样的东西对于依赖注入的自定义实现可能很有用。是的,David,这正是我所寻找的解决方案,而且它工作得很好。但工厂模式将更有用。谢谢
    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);
    }