Доступ к значениям конструктора структуры или создание новых свойств структуры в 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, но я не нашел хороших, понятных примеров, которые делают то, что я пытаюсь сделать здесь конкретно. Я открыт для любых идей о том, как этого добиться, и я ищу надежный пример кода.