Jb *_*ain 19
正如其他人所说,如果您需要这样做,那么您将面临一个设计问题.现在,如果你想知道它是否仅仅是为了知道,或者世界上没有别的方法可以做到这一点,那么在一个非常小的帮助库和扩展方法的帮助下,它确实是可能的.
请考虑以下代码:
class Person {
int age;
string name;
public int Age { get { return age; } }
public string Name { get { return name; } }
}
// ...
using Mono.Reflection;
using System.Reflection;
// ...
Person person = new Person (27, "jb");
PropertyInfo nameProperty = typeof (Person).GetProperty ("Name");
FieldInfo nameField = nameProperty.GetBackingField ();
nameField.SetValue (person, "jbe");
Run Code Online (Sandbox Code Playgroud)
使用此代码,您可以仅使用属性获取属性的支持字段,并为支持字段分配新值.您可以阅读有关实施的更多详细信息.
另请注意,它仅适用于简单属性,例如:
public int Age { get { return age; } }
public string Name {
get { return name; }
set { name = value; }
}
public double Velocity { get; private set; }
Run Code Online (Sandbox Code Playgroud)
如果您具有自定义代码的复杂属性,则后备字段解析程序将失败.
Sim*_*tes 16
作为自动生成的只读属性的一个非常脏的解决方法:
class MyTestClass
{
public string MyProperty { get; }
public MyTestClass( string MyProperty )
{
this.MyProperty = MyProperty;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式修改自动生成的支持字段:
MyTestClass MyClass = new MyTestClass( "Hello" );
FieldInfo MyWriteableField = MyClass.GetType().GetRuntimeFields().Where( a => Regex.IsMatch( a.Name, $"\\A<{nameof( MyClass.MyProperty )}>k__BackingField\\Z" ) ).FirstOrDefault();
MyWriteableField.SetValue( MyClass, "Another new value" );
Run Code Online (Sandbox Code Playgroud)
PS:当您使用.NET版本<4.6时,您可能需要更改一些代码才能工作.请享用!
Aby*_*te0 14
Simon Mattes的替代方案是
假设你有:
public class MyClass
{
public int MyNumber {get;}
}
Run Code Online (Sandbox Code Playgroud)
如果用于测试目的,你可以这样做:
var field = typeof(MyClass).GetField("<MyNumber>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(anIstanceOfMyClass, 3);
Run Code Online (Sandbox Code Playgroud)