次の方法で共有


Type.GetField メソッド (String, BindingFlags)

指定したバインディング制約を使用して、指定したフィールドを検索します。

Overloads Public MustOverride Function GetField( _
   ByVal name As String, _   ByVal bindingAttr As BindingFlags _) As FieldInfo Implements IReflect.GetField
[C#]
public abstract FieldInfo GetField(stringname,BindingFlagsbindingAttr);
[C++]
public: virtual FieldInfo* GetField(String* name,BindingFlagsbindingAttr) = 0;
[JScript]
public abstract function GetField(
   name : String,bindingAttr : BindingFlags) : FieldInfo;

パラメータ

  • name
    取得するデータ フィールドの名前を格納している String

  • bindingAttr
    検索の実行方法を指定する 1 つ以上の BindingFlags から成るビット マスク。

    または

    null 参照 (Visual Basic では Nothing) を返す 0。

戻り値

指定した要件と一致するフィールドが存在する場合は、そのフィールドを表す FieldInfo オブジェクト。それ以外の場合は null 参照 (Visual Basic では Nothing) 。

実装

IReflect.GetField

例外

例外の種類 条件
ArgumentNullException name が null 参照 (Visual Basic では Nothing) です。

解説

型に対するリフレクション時に Get メソッドによって返される基本クラスのメンバを次の表に示します。

メンバ型 静的 非静的
コンストラクタ いいえ いいえ
フィールド いいえ はい。フィールドは常に名前と署名によって隠ぺいされます。
イベント 適用なし 共通型システムの規則では、継承は、プロパティを実装するメソッドの継承と同じになります。リフレクションは、プロパティを名前と署名によって隠ぺいされているとして扱います。下記のメモ 2 を参照してください。
メソッド いいえ はい。メソッド (仮想メソッドと非仮想メソッドの両方) は、名前によって隠蔽することもできますし、名前と署名によって隠蔽することもできます。
入れ子になった型 いいえ いいえ
プロパティ 適用なし 共通型システムの規則では、継承は、プロパティを実装するメソッドの継承と同じになります。リフレクションは、プロパティを名前と署名によって隠ぺいされているとして扱います。下記のメモ 2 を参照してください。
  1. 名前と署名による隠ぺいでは、カスタム修飾子、戻り値の型、パラメータの型、sentinel、およびアンマネージ呼び出し規約を含めて、署名のすべての部分が判断の対象となります。これはバイナリ比較です。
  2. リフレクションの場合、プロパティおよびイベントは名前と署名によって隠ぺいされています。基本クラスに get アクセサと set アクセサの両方を持つプロパティがあり、派生クラスには get アクセサしかない場合、派生クラスのプロパティにより基本クラスのプロパティが隠ぺいされ、基本クラスの set アクセサにはアクセスできません。
  3. カスタム属性は、共通の型システムの一部ではありません。

次の BindingFlags フィルタ フラグは、検索対象に含めるフィールドを定義するために使用できます。

  • 戻り値を取得するには、 BindingFlags.Instance または BindingFlags.Static のいずれかを指定する必要があります。
  • 検索対象にパブリック フィールドを含めるための BindingFlags.Public を指定します。
  • 検索対象にパブリックでないフィールド (つまり、プライベート フィールドやプロテクト フィールド) を含めるための BindingFlags.NonPublic を指定します。
  • 階層構造の上位にある静的メンバを含めるための BindingFlags.FlattenHierarchy を指定します。

次の BindingFlags 修飾フラグは、検索方法を変更するために使用できます。

  • name の大文字と小文字の違いを無視する場合は BindingFlags.IgnoreCase
  • Type で宣言されたフィールドだけを検索するための BindingFlags.DeclaredOnly 。単に継承されただけのフィールドは検索されません。

詳細については、「 System.Reflection.BindingFlags 」を参照してください。

要求された型がパブリックではなく、呼び出し元に現在のアセンブリ外の非パブリック オブジェクトをリフレクションするための ReflectionPermission がない場合、このメソッドは null 参照 (Visual Basic では Nothing) を返します。

使用例

[Visual Basic, C#, C++] 指定したクラスの Type オブジェクトを取得し、指定したバインディング フラグに一致するフィールドの FieldInfo オブジェクトを取得して、そのフィールドの値を表示する例を次に示します。

 

Imports System
Imports System.Reflection
Imports System.Security
Imports Microsoft.VisualBasic

Public Class MyFieldClassA
    Public myField As String = "A Field"

    Public Property Field() As String
        Get
            Return myField
        End Get
        Set(ByVal Value As String)
            If myField <> value Then
                myField = value
            End If
        End Set
    End Property
End Class 'MyFieldClassA

Public Class MyFieldClassB
    Public myField As String = "B Field"

    Public Property Field() As String
        Get
            Return myField
        End Get
        Set(ByVal Value As String)
            If myField <> value Then
                myField = value
            End If
        End Set
    End Property
End Class 'MyFieldClassB


Public Class MyFieldInfoClass

    Public Shared Sub Main()
        Try
            Dim myFieldObjectB As New MyFieldClassB()
            Dim myFieldObjectA As New MyFieldClassA()

            Dim myTypeA As Type = Type.GetType("MyFieldClassA")
            Dim myFieldInfo As FieldInfo = myTypeA.GetField("myField")

            Dim myTypeB As Type = Type.GetType("MyFieldClassB")
            Dim myFieldInfo1 As FieldInfo = myTypeB.GetField("myField", BindingFlags.Public Or BindingFlags.Instance)

            Console.WriteLine("The value of the field is : {0} ", myFieldInfo.GetValue(myFieldObjectA))
            Console.WriteLine("The value of the field is : {0} ", myFieldInfo1.GetValue(myFieldObjectB))
        Catch e As SecurityException
            Console.WriteLine("An exception has occurred: ")
            Console.WriteLine(("Message :" + e.Message))
        Catch e As ArgumentNullException
            Console.WriteLine("An exception has occurred: ")
            Console.WriteLine(("Message :" + e.Message))
        Catch e As Exception
            Console.WriteLine("An exception has occurred: ")
            Console.WriteLine(("Message :" + e.Message))
        End Try
    End Sub 'Main
End Class 'MyFieldInfoClass


[C#] 

using System;
using System.Reflection;
using System.Security;

public class MyFieldClassA
{
    public string field = "A Field";
    public string Field
    {
        get
        {
            return field;
        }
        set
        {
            if(field!=value)
            {
                field=value;
            }
        }
    }
}
public class MyFieldClassB
{
    public string field = "B Field";
    public string Field 
    {
        get
        {
            return field;
        }
        set
        {
            if(field!=value)
            {
                field=value;
            }
        }
    }
}

public class MyFieldInfoClass
{
    public static void Main()
    {
        try
        {
            MyFieldClassB myFieldObjectB = new MyFieldClassB();
            MyFieldClassA myFieldObjectA = new MyFieldClassA();
            Type myTypeA = Type.GetType("MyFieldClassA");
            FieldInfo myFieldInfo = myTypeA.GetField("field");
            Type myTypeB = Type.GetType("MyFieldClassB");
            FieldInfo myFieldInfo1 = myTypeB.GetField("field", BindingFlags.Public | BindingFlags.Instance);
            Console.WriteLine("The value of the field is : {0} ", myFieldInfo.GetValue(myFieldObjectA));
            Console.WriteLine("The value of the field is : {0} ", myFieldInfo1.GetValue(myFieldObjectB));
        }
        catch(SecurityException e)
        {
            Console.WriteLine("Exception Raised!");
            Console.WriteLine("Message :"+e.Message);
        }
        catch(ArgumentNullException e)
        {
            Console.WriteLine("Exception Raised!");
            Console.WriteLine("Message :"+e.Message);
        }
        catch(Exception e)
        {
            Console.WriteLine("Exception Raised!");
            Console.WriteLine("Message :"+e.Message);
        }
    }
}

[C++] 

#using <mscorlib.dll>

using namespace System;
using namespace System::Reflection;
using namespace System::Security;

public __gc class MyFieldClassA {
public:
   String* field;
   MyFieldClassA(){
      field = S"A Field";
   }
   __property String* get_Field() {

      return field;

   }
   __property void set_Field(String* value) {

      if (field!=value) {
         field=value;

      }
   }
};
public __gc class MyFieldClassB {
public:
   String* field;
   MyFieldClassB() {
      field = S"B Field";
   }
   __property String* get_Field() {

      return field;

   }
   __property void set_Field(String* value) {

      if (field!=value) {
         field=value;

      }
   }
};

int main() {
   try {
      MyFieldClassB* myFieldObjectB = new MyFieldClassB();
      MyFieldClassA* myFieldObjectA = new MyFieldClassA();
      Type*  myTypeA = Type::GetType(S"MyFieldClassA");
      FieldInfo*  myFieldInfo = myTypeA->GetField(S"field");
      Type*  myTypeB = Type::GetType(S"MyFieldClassB");
      FieldInfo*  myFieldInfo1 = myTypeB->GetField(S"field", static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::Instance));
      Console::WriteLine(S"The value of the field is : {0} ", myFieldInfo->GetValue(myFieldObjectA));
      Console::WriteLine(S"The value of the field is : {0} ", myFieldInfo1->GetValue(myFieldObjectB));
   } catch (SecurityException* e) {
      Console::WriteLine(S"Exception Raised!");
      Console::WriteLine(S"Message : {0}", e->Message);
   } catch (ArgumentNullException* e) {
      Console::WriteLine(S"Exception Raised!");
      Console::WriteLine(S"Message : {0}", e->Message);
   } catch (Exception* e) {
      Console::WriteLine(S"Exception Raised!");
      Console::WriteLine(S"Message : {0}", e->Message);
   }
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: 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, Common Language Infrastructure (CLI) Standard

.NET Framework セキュリティ:

参照

Type クラス | Type メンバ | System 名前空間 | Type.GetField オーバーロードの一覧 | FieldInfo | String | BindingFlags | DefaultBinder | ReflectionPermission | GetFields