Доступ к значениям конструктора структуры или создание новых свойств структуры в Runtme

Я использую BepInEx, производную от Harmony, для исправления сборки игры во время выполнения.

Исходная структура, которую я хочу изменить, выглядит так:

      public struct OriginalStruct
{
    
    public OriginalStruct(SomeClass someClass)
    {
        this.Property = someClass.SomeClassProperty1;
    }

    public float Property;

Я могу изменить сам конструктор и добавить переменные, которые обращаются к свойствам из SomeClass. Однако мне нужно создать общедоступные свойства этих новых переменных в других для других исправленных методов во внешних классах, которые я изменил, чтобы иметь доступ к ним через эти новые свойства.

Исправленная структура будет выглядеть так:

      public struct OriginalStruct
{
    
    public OriginalStruct(SomeClass someClass)
    {
        this.Property = someClass.SomeClassProperty1;
        this.MyProperty= someClass.SomeClassProperty2;

    }

    public float Property;

    public float MyProperty;

Исходный метод, который обращается к OriginalStruct, выглядит так:

      public void SomeOriginalMethod(ref OriginalStuct originalStuct)
{
 float someVariable = originalStruct.Property
}

Я хочу исправить это, чтобы оно выглядело так:

      public void PatchedSomeOriginalMethod(ref OriginalStuct originalStuct)
{
 float someVariable = originalStruct.Property
 float myVariable = originalStruct.MyProperty
}

Таким образом, проблема заключается в том, чтобы найти какой-либо способ прямого доступа к значениям конструктора структуры или получить доступ к его экземпляру SomeClass, чтобы я мог получить доступ к его свойству из SomeOriginalMethod.

Единственная альтернатива, которую я вижу, — добавить свойства в OriginalStuct.

Насколько я понимаю, это выходит за пределы возможности исправления во время выполнения с помощью CIL. Я видел предложения создать подкласс исходного класса/структуры через System.Reflection.Emit, но я не нашел хороших, понятных примеров, которые делают то, что я пытаюсь сделать здесь конкретно. Я открыт для любых идей о том, как этого добиться, и я ищу надежный пример кода.

0 ответов

Другие вопросы по тегам