gpt4 book ai didi

c# - 是否可以在不运行该类的任何代码的情况下创建该类的实例? (没有构造函数,没有字段初始化)

转载 作者:太空狗 更新时间:2023-10-29 20:49:21 26 4
gpt4 key购买 nike

我创建了一个引擎,它接受实现接口(interface)的第 3 方插件 (DLL)。

由于我无法控制插入的代码,我希望能够从正确的类(GetTypes 循环直到找到接口(interface)类)运行 1 个特定方法(从接口(interface))。

由于任何人都可以创建在 Activator.CreateInstance 上执行的良好构造函数代码,我可以使用 FormatterServices.GetUninitializedObject 来解决这个问题。但是,当在类中的字段上初始化代码时,这无济于事。

public class myclass : myinterface {

public someotherclass name = new someotherclass()

public myclass() {
//Unknown code
}

//I only want this run.
public string MyProperty{
get {
return "ANiceConstString";
}
}
}

这两种方式(CreateInstance/GetUninitializedObject)的问题是someotherclass的构造函数会被运行。

在你开始分析我的需求之前。这仅在引擎初始化时运行以获得一组标准值。如果这个 get'er 依赖于其他初始化值,“插件”将被标记为失败,因为没有返回有效值。如果未标记为失败,稍后将使用 Activator.CreateInstance() 正确加载该类。

所以坚持这个问题:.Net 是否支持以任何方式创建 100% 未初始化的类?

更新答案。我在发布问题之前对此进行了测试。

对于someotherclass不会运行的答案,我已经测试过了,如果是静态的,它会运行。

public class myclass : myinterface {

static Tutle test;

public myclass () {
test = new Tutle();
}

public class Tutle {
public Tutle() {
MessageBox.Show("RUN!");
}
}
}

CreateInstance 显示消息框。 GetUninitializedObject 没有。

public class myclass : myinterface {

static Tutle test = new Tutle();

public myclass () {
}

public class Tutle {
public Tutle() {
MessageBox.Show("RUN!");
}
}
}

CreateInstance 显示消息框。 GetUninitializedObject 显示消息框。

有没有办法绕过静态字段初始化器和构造函数?

最佳答案

简单地:

var obj = (myclass)FormatterServices.GetUninitializedObject(typeof(myclass));

不会运行构造函数/字段初始值设定项。完全没有。它不会运行someotherclass的构造函数; name 将为 null

但是,如果需要,它会根据标准 .NET 规则执行任何存在的静态构造函数。

然而!我应该注意,此方法不适用于临时使用;它的主要目的是用于序列化程序和远程处理引擎。如果您随后没有采取措施将它们恢复到有效状态(任何序列化程序/远程处理引擎都一定会这样做),那么以这种方式创建的类型很有可能无法正常工作。

关于c# - 是否可以在不运行该类的任何代码的情况下创建该类的实例? (没有构造函数,没有字段初始化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14136272/

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