Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查对象的实例是否为只读_C#_C# 4.0_Object_Reflection_Readonly - Fatal编程技术网

C# 检查对象的实例是否为只读

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(),但这是

如果我有一个对象的实例,如何检查它是否为只读

我已经搜索了System.Type,其中有大量的函数类型,但没有IsReadOnly(),
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;