我有一个看起来像这样的课:
public class Field
{
public string FieldName;
public string FieldType;
}
Run Code Online (Sandbox Code Playgroud)
并且List<Field>具有值的对象:
{"EmployeeID","int"},
{"EmployeeName","String"},
{"Designation","String"}
Run Code Online (Sandbox Code Playgroud)
我想创建一个如下所示的类:
Class DynamicClass
{
int EmployeeID,
String EmployeeName,
String Designation
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我希望在运行时生成它.我不希望物理CS文件驻留在我的文件系统中.
我想在我正在开发的框架中绕过一些经典的汇编扫描技术.
所以,说我已经定义了以下合同:
public interface IModule
{
}
Run Code Online (Sandbox Code Playgroud)
这就是说Contracts.dll.
现在,如果我想发现这个接口的所有实现,我们可能会做类似以下的事情:
public IEnumerable<IModule> DiscoverModules()
{
var contractType = typeof(IModule);
var assemblies = AppDomain.Current.GetAssemblies() // Bad but will do
var types = assemblies
.SelectMany(a => a.GetExportedTypes)
.Where(t => contractType.IsAssignableFrom(t))
.ToList();
return types.Select(t => Activator.CreateInstance(t));
}
Run Code Online (Sandbox Code Playgroud)
不是一个很好的例子,但它会做.
现在,这些类型的汇编扫描技术可能完全不足,而且它们都在运行时完成,通常会影响启动性能.
在新的DNX环境中,我们可以使用ICompileModule实例作为元编程工具,因此您可以将实现捆绑ICompileModule到Compiler\Preprocess项目中的文件夹中,并让它做一些时髦的事情.
我的目标是使用一个ICompileModule实现来完成我们在运行时在编译时所做的工作.
IModuleModuleList用一个实现来调用它,该实现产生每个模块的实例.public static class ModuleList
{
public static IEnumerable<IModule>() GetModules()
{
yield return new Module1();
yield return new Module2();
} …Run Code Online (Sandbox Code Playgroud)