gpt4 book ai didi

C# 在运行时创建构造函数

转载 作者:行者123 更新时间:2023-11-30 20:47:30 25 4
gpt4 key购买 nike

我开始阅读有关反射的内容,我想知道是否有一种方法可以在程序运行时创建构造函数。例如:获取类 C 并检查 C 是否有空构造函数,如果没有,则创建并使用它来创建此实例。构造函数也可能有参数。

我该怎么做?谢谢

最佳答案

在 .NET 世界中,您需要了解很多事情。

  1. 当一个类没有构造函数时,编译器会添加一个默认的不带任何参数的公共(public)构造函数。

这意味着当你有以下类(class)时:

public class Person
{
public int Age
{
get { return 10; }
}
}

它可以像这样实例化:

class Program
{
static void Main(string[] args)
{
var person = new Person();
Console.WriteLine(person.Age);
}
}

这将产生以下输出:

enter image description here

  1. 一旦创建构造函数,编译器就不会添加默认的公共(public)无参数构造函数。

这意味着当您将 person 类更改为以下内容时:

public class Person
{
private Person() { }

public int Age
{
get { return 10; }
}
}

您无法使用 new() 关键字实例化该类:

var person = new Person();

这会导致编译错误:

enter image description here

  1. 通过反射,如果构造函数是私有(private)的和/或包含参数,您可以构造一个对象事件。

话虽如此,您的问题并不清楚,因为您永远不需要在运行时创建构造函数,原因如下:

  • 没有构造函数的类,编译器添加了构造函数,可以通过反射构造。
  • 可以通过反射构造具有构造函数的类。
  • 可以通过反射构造具有不可访问构造的类。

现在,让我们看看如何使用上述 3 种场景使用反射来构造类:

  • 您有一个没有构造函数的类。

    public class Person
    {
    public int Age
    {
    get { return 10; }
    }
    }

    您的实例可以像这样创建:

    var instance = (Person)Activator.CreateInstance(typeof(Person));
  • 你有一个带有公共(public)构造函数的类

    public class Person
    {
    public Person() { }

    public int Age
    {
    get { return 10; }
    }
    }

    您的实例可以按照上面相同的方式创建,没有什么特别的需要。

    var instance = (Person)Activator.CreateInstance(typeof(Person));
  • 你有一个带有私有(private)构造函数的类

    public class Person
    {
    private Person() { }

    public int Age
    {
    get { return 10; }
    }
    }

    现在您的实例无法以如此简单的方式创建。首先,您需要获取 ConstructorInfo:

    ConstructorInfo c = typeof(Person).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {  }, null);

    使用上面的代码,您请求有关非公共(public)构造函数的信息 (BindingFlags.NonPublic)。

    检索到它后,您可以像这样构造您的对象:

    var instance = (Person)c.Invoke(new object[] { });

让我们用以下场景让它变得更难一些:

  • 您有一个带有接受参数的公共(public)构造函数的类:

    public class Person
    {
    public Person(int age)
    {
    Age = age;
    }

    public readonly int Age;
    }

    创建还是挺简单的:

    var instance = (Person)Activator.CreateInstance(typeof(Person), 15);

    您只需按照在构造函数中定义的方式传递所有参数即可。

  • 您有一个带有接受参数的私有(private)构造函数的类:

    public class Person
    {
    public Person(int age)
    {
    Age = age;
    }

    public readonly int Age;
    }

    同样,我们需要 ConstructorInfo 对象,但现在我们需要指定构造函数接受的参数类型。在上面的示例中,这是一个整数:

    ConstructorInfo c = typeof(Person).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(int) }, null);

    现在,您可以创建一个对象,并在最后一个参数中指定构造对象的所有参数。

    var instance = (Person)c.Invoke(new object[] { 15 });

所以,这是一篇关于反射(reflection)的很长的帖子,但我希望我能弄清楚一些事情。至少,现在应该清楚为什么您不需要在运行时添加构造函数来调用对象。

关于C# 在运行时创建构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com