在C#中设置只读属性的值

本文关键字:只读属性 设置 | 更新日期: 2023-09-27 18:21:52

我正在尝试用c#为游戏制作一个mod,我想知道是否有办法使用反射来更改只读属性的值。

在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)

在这两种情况下都可以:

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; } }

则必须相应地修改CCD_ 1。

是的,这是绝对可能的。我不知道这是好的做法还是对你的目的有帮助。抛开@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;
        }
    }
}

正如Mark所说,在某些情况下,你可能无法做到这一点。认为属性本身可以是从其他属性成员派生的函数。

然而,你可能想尝试这里解释的机制:

是否可以通过反射设置私有财产?