gpt4 book ai didi

c# - 是否可以在已经创建的实例上直接调用构造函数?

转载 作者:太空狗 更新时间:2023-10-29 18:20:01 24 4
gpt4 key购买 nike

我知道您可以直接调用 static constructor of a typeI know that you can create an instance of an object without calling the constructor , 但是有没有办法在已经存在的实例上运行类型 (.ctor) 的构造函数?

我正在寻找类似的东西:

public static void Reinitialize<T>(T instance)
{
var initializer = typeof(T).GetHiddenConstructorThatDoesntNew(typeof(int), typeof(string));
// call the constructor (int, string) on instance
initializer.Invoke(instance, 7, "Bill");
}

我知道我永远不需要这样做,我更想知道是否可以可能在已创建的对象上重新调用构造函数/初始化程序。

最佳答案

ConstructorInfo 对象重载MethodBaseInvoke 方法,但不隐藏继承的方法。您只需确保传递正确的实例即可。示例:

using System;
using System.Reflection;

class A
{
public int i;
public A()
{
Console.WriteLine("A()");
}
private A(int j)
{
Console.WriteLine("A(" + j + "): i = " + i);
}
}

static class Program
{
static void Main(string[] args)
{
var a = new A();
a.i = 3;
var constructor = a.GetType().GetConstructor(BindingFlags.Instance | BindingFlags.Public |BindingFlags.NonPublic, null, new Type[] { typeof(int) }, null);
constructor.Invoke(a, new object[] { 3 });
}
}

但是,正如这个答案也显示的那样,这不会重置对象的任何字段,并且可以在假设所有字段都保留为默认值的情况下编写构造函数。如果你有这样的构造函数,你肯定需要确保你不会弄乱任何字段,或者如果你有,请重新设置它们。如果您有一个尚未为其调用构造函数的未初始化对象,那应该没问题。

关于c# - 是否可以在已经创建的实例上直接调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159335/

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