相关疑难解决方法(0)

如何在C#中动态创建一个类?

我有一个看起来像这样的课:

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文件驻留在我的文件系统中.

.net c# reflection.emit dynamic-class-creation

204
推荐指数
10
解决办法
20万
查看次数

使用Roslyn在引用的程序集中获取接口实现

我想在我正在开发的框架中绕过一些经典的汇编扫描技术.

所以,说我已经定义了以下合同:

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实例作为元编程工具,因此您可以将实现捆绑ICompileModuleCompiler\Preprocess项目中的文件夹中,并让它做一些时髦的事情.

我的目标是使用一个ICompileModule实现来完成我们在运行时在编译时所做的工作.

  • 在我的引用(包括编译和程序集)和我当前的编译中,发现所有可实现的实例 IModule
  • 创建一个类,让我们ModuleList用一个实现来调用它,该实现产生每个模块的实例.
public static class ModuleList
{
    public static IEnumerable<IModule>() GetModules()
    {
        yield return new Module1();
        yield return new Module2();
    } …
Run Code Online (Sandbox Code Playgroud)

c# metaprogramming roslyn dnx

15
推荐指数
2
解决办法
1574
查看次数