2015-11-12 2 views
1

Итак, я пытаюсь создать мод для игры в C#, и мне интересно, есть ли способ изменить значение свойства только для чтения с использованием отражений.C# Нужно помочь установить значение свойства только для чтения

Я новичок в коде, поэтому я в тупике.

+0

в целом - нет – Igor

+3

Duplicate: http://stackoverflow.com/questions/3706389/changing-read-only-properties-with-reflection – SquidScareMe

+3

Readonly означает именно это, ReadOnly. Он не может быть изменен после его назначения. Что вы пытаетесь достичь? – JimmyV

ответ

3

В общем, нет.

Три пример:

public int Value { get { return _value + 3; } } // No 

public int Value { get { return 3; } } // No 

public int Value { get; private set; } // Yes 

Таким образом, вы можете изменить значение свойства, а это свойство имеет соответствующее частное, защищенное или внутреннее поле.

0

Как сказал Марк, могут быть сценарии, где вы не можете. Подумайте, что само свойство может быть функцией, полученной из других свойств, членов.

Однако вы можете попробовать механизмы описаны здесь:

Is it possible to set private property via reflection?

5

Попробуйте это:

typeof(foo).GetField("bar", BindingFlags.Instance|BindingFlags.NonPublic).SetValue(foo,yourValue) 
0

Да, это вполне возможно. Является ли это хорошей практикой или полезной для вашей цели, я не знаю. Исходя из замечательного совета @ 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; 
     } 
    } 
} 
2

Вы можете в обоих этих сценариев:

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 соответственно.

Смежные вопросы