簡體   English   中英

在其他類型的基礎上創建一個新類型,只需更改名稱

[英]Create a new type based on other type, just changing the name

我有一個類型,想根據這個類型創建一個新類型,只想更改名稱。

例子:

var oldType = someObject.GetType();

var type = CreateNewType(oldType, "newType");

請讓我自己解釋一下:

我正在動態創建多個數據庫(通過在 EF Core 上下文中添加模型)。 這很有效,但僅在第一次嘗試時有效,但在第二次嘗試時無效,因為他將先前的表保留為單例上下文(附加到我所看到的類型)。

在運行時構建新類型的唯一方法是使用一些重型反射來動態創建 IL 代碼:

話雖如此,除非您對此有非常特殊的需求,否則這聽起來像是XY 問題 我建議您創建一個新問題,描述您在使用 EF 核心時面臨的具體問題(包括一個最小的可重現示例),並讓 EF 專家提出替代解決方案。

只是在這里回答問題本身,即使不是最好的解決方案:

可以從這里改編:

從帶有基類和附加字段的 TypeBuilder 創建動態類型會產生異常

代碼:

public class ClassBuilder
{
    readonly AssemblyName _assemblyName;

    public ClassBuilder(string className)
    {
        _assemblyName = new AssemblyName(className);
    }

    public Type CopyType(Type type, string name)
    {
        var assemblyBuilder =
            AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(name), AssemblyBuilderAccess.Run);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");

        TypeBuilder typeBuilder = moduleBuilder.DefineType(_assemblyName.FullName
            , TypeAttributes.Public |
              TypeAttributes.Class |
              TypeAttributes.AutoClass |
              TypeAttributes.AnsiClass |
              TypeAttributes.BeforeFieldInit |
              TypeAttributes.AutoLayout
            , type);

        typeBuilder.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName |
                                             MethodAttributes.RTSpecialName);

        return typeBuilder.CreateType();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM