Итак, я пытаюсь создать мод для игры в C#, и мне интересно, есть ли способ изменить значение свойства только для чтения с использованием отражений.C# Нужно помочь установить значение свойства только для чтения
Я новичок в коде, поэтому я в тупике.
Итак, я пытаюсь создать мод для игры в C#, и мне интересно, есть ли способ изменить значение свойства только для чтения с использованием отражений.C# Нужно помочь установить значение свойства только для чтения
Я новичок в коде, поэтому я в тупике.
В общем, нет.
Три пример:
public int Value { get { return _value + 3; } } // No
public int Value { get { return 3; } } // No
public int Value { get; private set; } // Yes
Таким образом, вы можете изменить значение свойства, а это свойство имеет соответствующее частное, защищенное или внутреннее поле.
Как сказал Марк, могут быть сценарии, где вы не можете. Подумайте, что само свойство может быть функцией, полученной из других свойств, членов.
Однако вы можете попробовать механизмы описаны здесь:
Попробуйте это:
typeof(foo).GetField("bar", BindingFlags.Instance|BindingFlags.NonPublic).SetValue(foo,yourValue)
Да, это вполне возможно. Является ли это хорошей практикой или полезной для вашей цели, я не знаю. Исходя из замечательного совета @ ske57, вот примерная программа, которая демонстрирует отражение. Начальное значение поля 5 и значение отраженного поля 75 записываются в консоль.
using System;
using System.Reflection;
namespace JazzyNamespace
{
class Program
{
static void Main()
{
var reflectionExample = new ReflectionExample();
// access the compiled value of our field
var initialValue = reflectionExample.fieldToTest;
// use reflection to access the readonly field
var field = typeof(ReflectionExample).GetField("fieldToTest", BindingFlags.Public | BindingFlags.Instance);
// set the field to a new value during
field.SetValue(reflectionExample, 75);
var reflectedValue = reflectionExample.fieldToTest;
// demonstrate the change
Console.WriteLine("The complied value is {0}", initialValue);
Console.WriteLine("The value changed is {0}", reflectedValue);
Console.ReadLine();
}
}
class ReflectionExample
{
public readonly int fieldToTest;
public ReflectionExample()
{
fieldToTest = 5;
}
}
}
Вы можете в обоих этих сценариев:
readonly int value = 4;
и
int value {get; private set}
использованием
typeof(Foo)
.GetField("value", BindingFlags.Instance)
.SetValue(foo, 1000); // (the_object_you_want_to_modify, the_value_you_want_to_assign_to_it)
Вы не можете изменить
int value { get { return 4; } }
все же.
Если она возвращает вычисленное значение, как
int value { get { return _private_val + 10; } }
вы должны изменить _private_val
соответственно.
в целом - нет – Igor
Duplicate: http://stackoverflow.com/questions/3706389/changing-read-only-properties-with-reflection – SquidScareMe
Readonly означает именно это, ReadOnly. Он не может быть изменен после его назначения. Что вы пытаетесь достичь? – JimmyV