フィールドをコンストラクタの本体だけでしか設定できないのかどうかを示す値を取得します。
Public ReadOnly Property Is As Boolean
[C#]
public bool IsInitOnly {get;}
[C++]
public: __property bool get_IsInitOnly();
[JScript]
public function get IsInitOnly() : Boolean;
プロパティ値
フィールドに InitOnly 属性が設定されている場合は true 。それ以外の場合は false 。
解説
戻り値が true の場合、フィールドは初期化できますが、初期化後は読み取り専用になります。
IsInitOnly プロパティを取得するには、最初に Type クラスを取得します。そして、その Type から FieldInfo を取得します。最後に、 FieldInfo から IsInitOnly プロパティを取得します。非パブリック フィールドにアクセスするには、 BindingFlags を NonPublic に設定し、 GetField メソッドで Static か Instance BindingFlags を選択します。
IsInitOnly プロパティは、 FieldAttributes.InitOnly 属性が設定されたときに設定されます。
使用例
2 つのフィールドを作成する例を次に示します。2 番目のフィールドは読み取り専用で、対応する set アクセサがなく、 IsInitOnly が true に設定されています。
Imports System
Imports System.Reflection
Imports Microsoft.VisualBasic
'Make two fields, one public and one read-only.
Public Class Myfielda
Public field As String = "A - public field"
End Class 'Myfielda
Public Class Myfieldb
Private ReadOnly field As String = "B - readonly field"
End Class 'Myfieldb
Public Class Myfieldinfo
Public Shared Function Main() As Integer
Console.WriteLine("Reflection.FieldInfo")
Console.WriteLine()
Dim Myfielda As New Myfielda()
Dim Myfieldb As New Myfieldb()
'Get the Type and FieldInfo.
Dim MyTypea As Type = Type.GetType("Myfielda")
Dim Myfieldinfoa As FieldInfo = MyTypea.GetField("field", BindingFlags.Public Or BindingFlags.Instance)
Dim MyTypeb As Type = Type.GetType("Myfieldb")
Dim Myfieldinfob As FieldInfo = MyTypeb.GetField("field", BindingFlags.NonPublic Or BindingFlags.Instance)
'Modify the fields.
'Note that Myfieldb is not modified, as it is
'read-only (IsInitOnly is True).
Myfielda.field = "A- modified"
'Myfieldb.field = "B- modified"
'For the first field, get and display the name, field, and IsInitOnly state.
Console.WriteLine("{0} - {1}, IsInitOnly = {2} ", MyTypea.FullName, Myfieldinfoa.GetValue(Myfielda), Myfieldinfoa.IsInitOnly)
'For the second field get and display the name, field, and IsInitOnly state.
Console.WriteLine("{0} - {1}, IsInitOnly = {2} ", MyTypeb.FullName, Myfieldinfob.GetValue(Myfieldb), Myfieldinfob.IsInitOnly)
Return 0
End Function 'Main
End Class 'Myfieldinfo
[C#]
using System;
using System.Reflection;
//Make two fields, one public and one read-only.
public class Myfielda
{
public string field = "A - public field";
public string Field
{
get{return field;}
set{if(field!=value){field=value;}}
}
}
public class Myfieldb
{
readonly string field = "B - readonly field";
public string Field
{
get{return field;}
}
}
public class Myfieldinfo
{
public static int Main()
{
Console.WriteLine("\nReflection.FieldInfo");
Myfielda Myfielda = new Myfielda();
Myfieldb Myfieldb = new Myfieldb();
//Get the Type and FieldInfo.
Type MyTypea = Type.GetType("Myfielda");
FieldInfo Myfieldinfoa = MyTypea.GetField("field",
BindingFlags.Public|BindingFlags.Instance);
Type MyTypeb = Type.GetType("Myfieldb");
FieldInfo Myfieldinfob = MyTypeb.GetField("field",
BindingFlags.NonPublic|BindingFlags.Instance);
//Modify the fields.
//Note that Myfieldb is not modified, as it is
//read-only (IsInitOnly is True).
Myfielda.field = "A- modified";
//Myfieldb.field = "B- modified";
//For the first field, get and display the name, field, and IsInitOnly state.
Console.Write("\n{0} - {1}, IsInitOnly = {2} ",
MyTypea.FullName,
Myfieldinfoa.GetValue(Myfielda),
Myfieldinfoa.IsInitOnly);
//For the second field get and display the name, field, and IsInitOnly state.
Console.Write("\n{0} - {1}, IsInitOnly = {2} ",
MyTypeb.FullName,
Myfieldinfob.GetValue(Myfieldb),
Myfieldinfob.IsInitOnly);
return 0;
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Reflection;
//Make two fields, one public and one read-only.
public __gc class Myfielda
{
public:
String* field;
Myfielda() : field(S"A - public field") {}
__property String* get_Field() {
return field;
}
__property void set_Field(String* value) {
if(field!=value){
field=value;
}
}
};
public __gc class Myfieldb
{
String* const field;
public:
Myfieldb() : field(S"B - readonly field") {}
__property String* get_Field() {
return field;
}
};
int main()
{
Console::WriteLine(S"\nReflection.FieldInfo");
Myfielda* myfielda = new Myfielda();
Myfieldb* myfieldb = new Myfieldb();
//Get the Type and FieldInfo.
Type* MyTypea = Type::GetType(S"Myfielda");
FieldInfo* Myfieldinfoa = MyTypea->GetField(S"field",
static_cast<BindingFlags>(BindingFlags::Public|BindingFlags::Instance));
Type* MyTypeb = Type::GetType(S"Myfieldb");
FieldInfo* Myfieldinfob = MyTypeb->GetField(S"field",
static_cast<BindingFlags>(BindingFlags::NonPublic|BindingFlags::Instance));
//Modify the fields.
//Note that Myfieldb is not modified, as it is
//read-only (IsInitOnly is True).
myfielda->field = S"A- modified";
//Myfieldb.field = "B- modified";
//For the first field, get and display the name, field, and IsInitOnly state.
Console::Write(S"\n{0} - {1}, IsInitOnly = {2} ",
MyTypea->FullName,
Myfieldinfoa->GetValue(myfielda), __box(Myfieldinfoa->IsInitOnly));
//For the second field get and display the name, field, and IsInitOnly state.
Console::Write(S"\n{0} - {1}, IsInitOnly = {2} ",
MyTypeb->FullName,
Myfieldinfob->GetValue(myfieldb), __box(Myfieldinfob->IsInitOnly));
return 0;
}
[JScript]
//Make two fields, one public and one read-only.
public class Myfielda
{
public var field : String = "A public field";
public function get Field() : String {
return field;
}
public function set Field( value : String ) {
if (field!=value) field=value;
}
}
public class Myfieldb
{
const field : String = "B readonly field";
public function get Field() : String {
return field;
}
}
public class Myfieldinfo
{
public static function Main() : void
{
Console.WriteLine("\nReflection.FieldInfo");
var myfielda : Myfielda = new Myfielda();
var myfieldb : Myfieldb = new Myfieldb();
//Get the Type and FieldInfo.
var MyTypea : Type = Type.GetType("Myfielda");
var Myfieldinfoa : FieldInfo = MyTypea.GetField("field", BindingFlags.Instance|BindingFlags.Public);
var MyTypeb : Type = Type.GetType("Myfieldb");
var Myfieldinfob : FieldInfo = MyTypeb.GetField("field", BindingFlags.Instance|BindingFlags.Public);
//Modify the fields.
//Note that Myfieldb is not modified, as it is
//read-only (IsInitOnly is True).
myfielda.field = "A- modified";
//Myfieldb.field = "B- modified";
//For the first field, get and display the name, field, and IsInitOnly.
Console.Write("\n{0} - {1}, IsInitOnly = {2} ",
MyTypea.FullName,
Myfieldinfoa.GetValue(myfielda),
Myfieldinfoa.IsInitOnly);
//For the second field get and display the name, field, and IsInitOnly.
Console.Write("\n{0} - {1}, IsLiteral = {2} ",
MyTypeb.FullName,
Myfieldinfob.GetValue(myfieldb),
Myfieldinfob.IsLiteral);
}
}
Myfieldinfo.Main();
このコードによって、次の出力が生成されます。
Reflection.FieldInfo
Myfielda - A- modified, IsInitOnly = False
Myfieldb - B readonly field, IsInitOnly = True
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
参照
FieldInfo クラス | FieldInfo メンバ | System.Reflection 名前空間 | FieldAttributes | GetField | Type