我有一个系统可以读取文件夹并将路径保存到数组列表中。这个文件夹包含一堆类文件“.cs”,所有这些类都实现了一个名为BaseScript的接口。
我试图找到类名,以便我可以调用类方法但是你应该能够定期将类文件添加到这个文件夹中,所以我不能硬编码要创建的对象。
e.g。我有一个名为“Manufacturing.cs”的文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LLS
{
class Manufacturing : BaseScript
{
public void init()
{
Console.WriteLine("Manufacturing...");
}
public void uninit() { }
public void recomp() { }
}
}
它实现了“BaseScript”:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LLS
{
public interface BaseScript
{
void init();
void uninit();
void recomp();
}
}
我需要能够使用路径:“\ Scripts \ Manufacturing.cs”来调用类似
的内容BaseScript[] s = {new "Manufacturing class name"}
我知道必须有一些迂回的做法。 如何找到类名,然后从该类创建实例?
答案 0 :(得分:0)
编辑 - 我错误地认为你有dll而不是cs文件出于某种原因。
正如其他人所说,你没有正确解释这个场景。但据我所知,你可能在这里实现了一个插件类型的模式。 为了在C#类上调用方法,您可以稍后添加,您需要遍历文件夹,获取* .cs文件,编译它们然后使用反射,加载程序集并创建您知道存在的类的实例(你应事先知道班级的完全限定名称。最后,您应该找到要调用的方法,然后使用反射调用它。以下是一些可以帮助您入门的代码:
Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.CompilerParameters parameters = new System.CodeDom.Compiler.CompilerParameters();
parameters.GenerateInMemory = true;
//You should add all referenced assembiles needed for the cs file here
//parameters.ReferencedAssemblies.Add();
var files = new System.IO.DirectoryInfo("Scripts").GetFiles("*.cs");
foreach (System.IO.FileInfo file in files)
{
System.CodeDom.Compiler.CompilerResults result =
provider.CompileAssemblyFromSource(parameters, new[] { System.IO.File.ReadAllText(file.FullName) });
object instance = result.CompiledAssembly.CreateInstance(file.Name);
if (instance is BaseScript)
{
//Do processing on (BaseScript)instance
}
}
答案 1 :(得分:0)
如果您的类在同一个程序集中,那么您可以使用Activator.CreateInstance创建该对象的实例。我并没有尝试你的代码。所以铸造可能不起作用。仔细检查此代码:
BaseScript s = (BaseScipt)Activator.CreateInstance(null, "Namespace.TestClass");