C# 检查对象的实例是否为只读
如果我有一个对象的实例,如何检查它是否为只读 我已经搜索了System.Type,其中有大量的函数类型,但没有IsReadOnly(),C# 检查对象的实例是否为只读,c#,c#-4.0,object,reflection,readonly,C#,C# 4.0,Object,Reflection,Readonly,如果我有一个对象的实例,如何检查它是否为只读 我已经搜索了System.Type,其中有大量的函数类型,但没有IsReadOnly(),ISWriteProperty(),GetReadWriteProperty(),或者类似的任何东西。我想像myObj.GetType().IsReadOnly()这样的东西太容易了,对象类本身除了GetType()之外没有什么有用的东西 当我用谷歌搜索这个问题时,我得到的只是使用readonly关键字的方法 我曾想过使用反射和GetProperty(),但这是
ISWriteProperty()
,GetReadWriteProperty()
,或者类似的任何东西。我想像myObj.GetType().IsReadOnly()
这样的东西太容易了,对象类本身除了GetType()之外没有什么有用的东西
当我用谷歌搜索这个问题时,我得到的只是使用readonly关键字的方法
我曾想过使用反射和GetProperty(),但这是一个存在于列表中的基类,我需要这个对象的实例是另一个对象中的一个单独的属性,我想这样做
有什么想法吗?没有对象是只读的概念。变量可以是只读的,但这是另一回事。例如:
class Foo
{
private readonly StringBuilder readOnlyBuilder;
private StringBuilder writableBuilder;
public Foo()
{
readOnlyBuilder = new StringBuilder();
writableBuilder = readOnlyBuilder;
}
}
这里只有一个StringBuilder
对象,但有两个字段——一个只读字段和一个可写字段
如果你问一个类型是否是不可变的(例如,
string
是不可变的,StringBuilder
不是),这是一个更棘手的问题。。。有许多不同种类的不变性。有关更多详细信息,请参阅。Jon Skeet是对的(当然),C#中没有只读对象。然而,一些框架,如WPF,有自己的只读对象概念。WPF具有可在运行时变为不可变的对象,您可以通过isfreezed
检查是否冻结了freezable。如果要检查只读字段,请使用FieldInfo类上的IsInitOnly
属性
我想下一次我需要更好地改进我的搜索词,我相信这个问题可能是重复的:你能提供一个你认为是只读的对象的例子吗?在对象级别,没有定义这样的概念。字段可能是只读的,也可能不是只读的,属性可能有公共集,也可能没有公共集,也可能没有标记为
[ImmutableObject(true)]
-但是。。。其中至少有两个并没有使其成为不可变的,第三个(字段)不是强制性的或过于常见的(因为字段是私有的)@Marc gravel:PropertyInfo对于一个类型,它提供了一个CanRead和CanWrite,我正在寻找一种方法来获取任何给定对象上的那些属性。by.GetType().GetProperties?属性不是对象,不是。属性只是具有特定模式的一些方法的术语,即get_SomeProp和set_SomeProp。因此,否:属性不是对象。在运行时,如果调用一个属性getter,它可能会返回一个对象,通过反射,您可以检查PropertyInfo,它表示属性的定义/声明(并且是一个ojbect)。但是:仅此而已。这里的CanWrite实际上只是:“是否定义了一个集合访问器”-但这与任何对象都无关。@Vijay Eric已经发布了,他打算进行调查-我认为这应该是相当确定的;此外,如果你要求人们看某件东西(这有点强迫),至少要把它说成是一种恩惠而不是要求/demand@Vijay:我不是微软的员工,也不是C#团队的成员。不过,我已经发布了一个答案——我很确定这是一个bug,而且有一种方法可以挑起特别恶劣的行为。我同意Marc的观点,“需要你的关注”和“请让你自己有空”更像是要求,而不是真正需要的。
//Get the Type and FieldInfo.
Type myType = typeof(myReadOnlyfield);
FieldInfo myFieldInfo = myType.GetField("ReadOnlyfield",
BindingFlags.Public | BindingFlags.Instance);
//Check if the field is read only
bool readOnly = myFieldInfo.IsInitOnly;