可能吗?用反射或其他方式?用反射改变只读属性
15
A
回答
13
正如其他人所说,如果您需要这样做,您将面临一个设计问题。现在,如果你想知道是否有可能只是为了知道,或者如果世界上没有别的办法可以做到这一点,那么确实有可能,在非常小的helper library和扩展方法的帮助下。
考虑下面的代码:
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");
使用此代码,你可以得到一个属性的支持字段只有财产,并分配一个新值支持字段。您可以阅读有关implementation的更多详细信息。
另外请注意,它仅适用于简单的属性,如:
public int Age { get { return age; } }
public string Name {
get { return name; }
set { name = value; }
}
public double Velocity { get; private set; }
如果你有一个自定义代码的复杂性,支持字段解析器将失败。
0
它取决于属性。如果它是一个计算属性 - 不,除非你知道它是基于什么。如果它只是一个私人领域的访问者,那么你可以尝试修改该领域。然而,一般来说,这是一个非常糟糕的主意,因为您可能不知道这会造成什么样的副作用。
0
PropertyInfo isReadOnly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance| BindingFlags.NonPublic);
//Remove the readonly property
isReadOnly.SetValue(param, false, null);
//.............put your code here.....
// Set readonly property
isReadOnly.SetValue(param, true, null);
9
作为一个非常肮脏的解决方法自动生成的只读属性:
class MyTestClass
{
public string MyProperty { get; }
public MyTestClass(string MyProperty)
{
this.MyProperty = MyProperty;
}
}
您可以修改自动生成以下列方式支持字段:
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");
PS:当你正在使用.NET版本< 4.6您可能需要更改一些代码才能工作。 享受!
7
西蒙·马特斯答案另一种是
假设你有:
public class MyClass
{
public int MyNumber {get;}
}
,如果你能做到这一点的测试目的:
var field = typeof(MyClass).GetField("<MyNumber>k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(anIstanceOfMyClass, 3);
相关问题
- 1. c#反射改变属性的方法
- 2. C#反射:GetProperties的'方法'只读属性
- 3. 反射返回只读属性的后台字段?
- 4. 使用属性反射测试属性
- 5. NHibernate的集合映射 - 只读属性
- 6. Javascript属性反射
- 7. 只读属性
- 8. NHibernate中的反向属性和只读属性在做什么?
- 9. C#自定义属性属性反射
- 10. 反射,属性和属性选择
- 11. 更改文件的只读属性
- 12. 更改对象的只读属性
- 13. 使用weak只读属性?
- 14. ScriptControlDescriptor.AddProperty&只读属性
- 15. OData只读属性
- 16. 接口,属性和反射
- 17. C#反射索引属性
- 18. Asp.Net反射计数属性
- 19. 反射物体的属性
- 20. EntityTypeConfiguration属性方法反射
- 21. 反射和复杂属性
- 22. 使用反射来调用属性
- 23. 只读VS自动(只读)属性
- 24. 更改属性网格中的只读属性的前景色
- 25. 光反射改变材料
- 26. EF 4.0 - 使用私有字段映射到只读属性
- 27. 使用反射设置属性值
- 28. C#中使用反射属性?
- 29. 使用反射创建MustOverride属性?
- 30. 使用反射来解决Linqed属性
ELODIE:这是可能的,但* *不要这样做**! – Gabe 2010-09-14 05:56:05
你是否试图改变一个属性的返回值只有getter或只读属性的值(像'private readonly int primitiveValue = 1;')? – Elisha 2010-09-14 06:09:32
嗨Éodie,你可以要求更多的信息,或接受答案? – 2011-01-07 11:08:33