c# 以类名为参创建父类相同的类的实例代码

yizhihongxing

要想创建一个父类相同的类的实例,需要使用 c# 的反射机制。首先需要获取要创建类的 Type 对象,然后使用 Activator.CreateInstance 方法创建实例。

步骤如下:

  1. 获取父类的 Type 对象;
Type baseType = typeof(BaseClass);
  1. 使用 Type 对象动态创建子类的 Type 对象;
Type subType = TypeBuilder
                .GetTypeBuilder("SubClass")
                .CreateType();
  1. 使用 Activator.CreateInstance 方法创建子类的实例;
object instance = Activator.CreateInstance(subType);

完整代码示例:

using System;
using System.Reflection;
using System.Reflection.Emit;

public class BaseClass
{
    public void Print()
    {
        Console.WriteLine("This is base class.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Type baseType = typeof(BaseClass);

        TypeBuilder subTypeBuilder = GetTypeBuilder("SubClass");
        subTypeBuilder.SetParent(baseType);
        subTypeBuilder.DefineDefaultConstructor(MethodAttributes.Public);

        Type subType = subTypeBuilder.CreateType();

        object instance = Activator.CreateInstance(subType);
        BaseClass baseInstance = instance as BaseClass;
        baseInstance.Print();
    }

    private static TypeBuilder GetTypeBuilder(string className)
    {
        var assemblyName = new AssemblyName(className);
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");

        TypeBuilder typeBuilder = moduleBuilder.DefineType(
            className,
            TypeAttributes.Public |
            TypeAttributes.Class |
            TypeAttributes.AutoClass |
            TypeAttributes.AnsiClass |
            TypeAttributes.BeforeFieldInit |
            TypeAttributes.AutoLayout,
            null
        );

        return typeBuilder;
    }
}

在上面的示例中,我们建立了一个名为 SubClass 的动态子类,并将它的父类设为了 BaseClass,并创建了它的实例。执行结果:

This is base class.

示例2:

如果子类的构造函数需要传递参数,还需要使用 CreateInstance 方法的重载函数来传入参数。

完整代码示例

using System;
using System.Reflection;
using System.Reflection.Emit;

public class BaseClass
{
    private readonly string message;

    public BaseClass(string message)
    {
        this.message = message;
    }

    public void Print()
    {
        Console.WriteLine(message);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Type baseType = typeof(BaseClass);

        TypeBuilder subTypeBuilder = GetTypeBuilder("SubClass");
        ConstructorBuilder constructorBuilder = DefineConstructor(subTypeBuilder);
        Type subType = subTypeBuilder.CreateType();

        object[] constructorArgs = new object[] { "This is sub class." };
        object instance = Activator.CreateInstance(subType, constructorArgs);
        BaseClass baseInstance = instance as BaseClass;
        baseInstance.Print();
    }

    private static TypeBuilder GetTypeBuilder(string className)
    {
        var assemblyName = new AssemblyName(className);
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");

        TypeBuilder typeBuilder = moduleBuilder.DefineType(
            className,
            TypeAttributes.Public |
            TypeAttributes.Class |
            TypeAttributes.AutoClass |
            TypeAttributes.AnsiClass |
            TypeAttributes.BeforeFieldInit |
            TypeAttributes.AutoLayout,
            typeof(BaseClass)
        );

        return typeBuilder;
    }

    private static ConstructorBuilder DefineConstructor(TypeBuilder typeBuilder)
    {
        ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(
            MethodAttributes.Public,
            CallingConventions.Standard,
            new Type[] { typeof(string) }
        );

        ILGenerator ilGenerator = constructorBuilder.GetILGenerator();
        ilGenerator.Emit(OpCodes.Ldarg_0);
        ilGenerator.Emit(OpCodes.Ldarg_1);
        ilGenerator.Emit(OpCodes.Call, typeof(BaseClass).GetConstructor(new Type[] { typeof(string) }));
        ilGenerator.Emit(OpCodes.Ret);

        return constructorBuilder;
    }
}

在上面的示例中,我们建立了一个名为 SubClass 的动态子类,并将它的父类设为了 BaseClass,SubClass 继承了父类的构造函数,并创建了它的实例。执行结果:

This is sub class.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 以类名为参创建父类相同的类的实例代码 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • securecrt的安装与破解(过程很详细!!!)

    SecureCRT的安装与破解(过程很详细!!!) SecureCRT是一款功能强大的终端仿真软件,被广泛应用于网络工程、系统管理和软件开发等领域。但是,由于其商业许可协议的限制,需要付费使用,为了方便大家学习和使用,本文将介绍其安装和破解的过程,并提醒大家请勿非法使用。 安装SecureCRT 首先从官方网站下载SecureCRT,选择对应的操作系统版本(…

    其他 2023年3月29日
    00
  • C语言实现将double/float 转为字符串(带自定义精度)

    下面是详细讲解“C语言实现将double/float 转为字符串(带自定义精度)”的完整攻略。 简介 在C语言中,将double/float类型转换为字符串是一项常见的操作。本文将介绍如何使用C语言来实现在转换时进行自定义精度控制。通俗易懂,适合初学者借鉴。 实现思路 将double/float转换为字符串需要以下几个步骤: 将小数部分转换为字符串 将整数部…

    other 2023年6月26日
    00
  • 路由器常见的默认IP地址清单汇总篇

    路由器常见的默认IP地址清单汇总篇攻略 路由器是连接计算机网络的设备,它使用IP地址来进行通信和管理。默认情况下,路由器会分配一个默认的IP地址,以便用户可以通过该地址访问路由器的管理界面。本文将详细介绍一些常见的默认IP地址,并提供两个示例说明。 1. 常见的默认IP地址 以下是一些常见的默认IP地址: 192.168.0.1 192.168.1.1 19…

    other 2023年7月30日
    00
  • 用VBS设置静态IP和DNS服务器地址的代码

    当使用VBS(Visual Basic Script)编写代码来设置静态IP和DNS服务器地址时,可以按照以下步骤进行操作: 首先,创建一个新的文本文件,并将其保存为以.vbs为扩展名的文件,例如set_static_ip.vbs。 打开该文件,并在其中输入以下代码: strComputer = \".\" ‘ 设置为本地计算机 ‘ 创建…

    other 2023年7月31日
    00
  • pycharm怎么安装?

    PyCharm怎么安装? PyCharm是一个由JetBrains开发的Python集成开发环境。它是一个非常流行的工具,被广泛地用于Python开发。在本文中,我们将介绍如何安装PyCharm。 第一步:下载PyCharm 在开始安装PyCharm之前,我们先要下载它。您可以在PyCharm官方网站(https://www.jetbrains.com/py…

    其他 2023年3月28日
    00
  • 获取App.config配置文件中的参数值

    获取App.config配置文件中的参数值可以通过.NET Framework中的ConfigurationManager类实现。 具体步骤如下: 在项目中添加App.config文件,添加相应的配置项。示例代码如下: <?xml version="1.0" encoding="utf-8" ?> <…

    other 2023年6月25日
    00
  • 暗黑3丢包现象怎么解决 丢包现象问题分析解决方法介绍

    暗黑3丢包现象怎么解决 在玩暗黑3的过程中,有时候我们会遇到丢包现象,导致游戏卡顿、延迟高甚至直接掉线。本文将为大家介绍暗黑3丢包现象的问题分析和解决方法。 丢包现象问题分析 通常情况下,暗黑3丢包现象是由网络问题导致的。可能是因为玩家所在地区的网络不稳定,或者是网络设备故障,导致玩家与服务器之间的通讯出现问题,从而出现丢包现象。 解决方法介绍 1. 优化网…

    other 2023年6月27日
    00
  • iphone设备总是提示存储空间不足怎么办 iphone存储空间清理方法教程

    iPhone设备提示存储空间不足怎么办? 背景 随着 iPhone 发展,手机内置存储空间不断增加,但是由于用户需求的不断增长,存储空间问题仍然是很普遍的。很多用户在使用 iPhone 常常会遇到 iPhone 设备内存不足的情况,这对用户的正常使用造成了很大的困扰。下面给出 iPhone 存储空间的清理方法。 iPhone存储空间清理方法教程 1. 清理照…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部