是否有可能创建一个类的实例,而不从类运行任何代码?(没有变量,没有字段初始化)

本文关键字:代码 任何 创建 变量 初始化 字段 运行 有可能 一个 实例 是否 | 更新日期: 2023-09-27 17:50:26

我创建了一个引擎,它采用第三方插件(DLL)来实现一个接口。

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

因为任何人都可以创建在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)的问题是的构造函数将被运行。

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

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

更新答案。在我发布问题之前,我测试了这个。

对于其他类不会运行的答案,我已经测试过了,它是静态运行的。

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的构造函数;namenull

但是,如果有必要,它将执行任何存在的静态构造函数。

然而

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

作为另一种设计考虑:

[SomeFeature("ANiceConstString")]
public class myclass : myinterface {
  public someotherclass name = new someotherclass()
  public myclass() {
     //Unknown code
  }
}

现在你可以在没有实例化的情况下访问特性;只使用:

var attrib = (SomeFeatureAttribute)Attribute.GetCustomAttribute(
    type, typeof(SomeFeatureAttribute));
string whatever = attrib == null ? null : attrib.Name;

:

[AttributeUsage(
    AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum)]
public sealed class SomeFeatureAttribute : Attribute
{
    private readonly string name;
    public string Name { get { return name; } }
    public SomeFeatureAttribute(string name) { this.name = name; }
}
相关文章: