Прочитать на английском

Поделиться через


BindingFlags Перечисление

Определение

Указывает флаги, управляющие привязкой и способом, используемым отражением при поиске членов и типов.

Это перечисление поддерживает побитовую комбинацию значений его членов.

C#
[System.Flags]
public enum BindingFlags
C#
[System.Flags]
[System.Serializable]
public enum BindingFlags
C#
[System.Flags]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum BindingFlags
Наследование
BindingFlags
Атрибуты

Поля

Имя Значение Описание
CreateInstance 512

Указывает, что отражение должно создавать экземпляр указанного типа. Вызывает конструктор, соответствующий указанным аргументам. Имя указанного члена игнорируется. Если тип поиска не указан, будет использоваться (Instance | Public). Невозможно вызвать инициализатор типа.

Этот флаг передается в метод InvokeMember для вызова конструктора.

DeclaredOnly 2

Указывает, что следует учитывать только члены, объявленные на уровне иерархии предоставленного типа. Унаследованные члены не учитываются.

Default 0

Указывает, что флаги привязки не заданы.

DoNotWrapExceptions 33554432
ExactBinding 65536

Указывает, что типы предоставленных аргументов должны точно совпадать с типами соответствующих формальных параметров. Отражение вызывает исключение, если вызывающий предоставляет ненулевой объект Binder, так как это подразумевает, что вызывающий предоставляет реализации BindToXXX, которые выберут соответствующий метод. Модуль привязки по умолчанию игнорирует этот флаг, тогда как пользовательские модули привязки могут реализовать его семантику.

FlattenHierarchy 64

Указывает, что следует вернуть общедоступные и защищенные статические члены вверху иерархии. Частные статические члены в наследуемых классах не возвращаются. Статические члены включают поля, методы, события и свойства. Вложенные типы не возвращаются.

GetField 1024

Указывает, что должно возвращаться значение заданного поля.

Этот флаг передается в метод InvokeMember для получения значения поля.

GetProperty 4096

Указывает, что должно возвращаться значение заданного свойства.

Этот флаг передается в метод InvokeMember для вызова метода считывания свойства.

IgnoreCase 1

Указывает, что регистр имени члена не должен учитываться во время привязки.

IgnoreReturn 16777216

Используется во взаимодействии COM для указания того, что возвращаемое значение члена можно игнорировать.

Instance 4

Указывает, что члены экземпляров следует включить в поиск.

InvokeMethod 256

Указывает, что следует вызвать метод. Это не должен быть конструктор или инициализатор типа.

Этот флаг передается в метод InvokeMember для вызова метода.

NonPublic 32

Указывает, что частные члены следует включить в поиск.

OptionalParamBinding 262144

Возвращает набор членов, количество параметров у которых совпадает с количеством предоставленных аргументов. Этот флаг привязки используется для методов, имеющих параметры со значениями по умолчанию, и методов с переменными аргументами (varargs). Этот флаг должен использоваться только с InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]).

Параметры со значениями по умолчанию используются только в вызовах, где аргументы в конце опускаются. Это должны быть последние аргументы.

Public 16

Указывает, что общедоступные члены следует включить в поиск.

PutDispProperty 16384

Указывает, что следует вызвать член PROPPUT в объекте COM. PROPPUT указывает функцию, задающую свойства, которая использует значение. Используйте PutDispProperty, если свойство содержит как объект PROPPUT, так и PROPPUTREF, и вам нужно определить, какой из них вызывается.

PutRefDispProperty 32768

Указывает, что следует вызвать член PROPPUTREF в объекте COM. PROPPUTREF указывает функцию, задающую свойство, которая использует ссылку вместо значения. Используйте PutRefDispProperty, если свойство содержит как объект PROPPUT, так и PROPPUTREF, и вам нужно определить, какой из них вызывается.

SetField 2048

Указывает, что следует установить значение заданного поля.

Этот флаг передается в метод InvokeMember для указания значения поля.

SetProperty 8192

Указывает, что следует установить значение заданного свойства. Для свойств COM указание этого флага привязки эквивалентно заданию PutDispProperty и PutRefDispProperty.

Этот флаг передается в метод InvokeMember для вызова метода задания свойства.

Static 8

Указывает, что статические члены следует включить в поиск.

SuppressChangeType 131072

Не реализован.

Примеры

В следующем примере показано множество флагов привязки.

C#
using System;
using System.Reflection;
using System.IO;

namespace BindingFlagsSnippet
{
    class Example
    {
        static void Main()
        {
            // BindingFlags.InvokeMethod
            // Call a static method.
            Type t = typeof (TestClass);

            Console.WriteLine();
            Console.WriteLine("Invoking a static method.");
            Console.WriteLine("-------------------------");
            t.InvokeMember ("SayHello", BindingFlags.InvokeMethod | BindingFlags.Public |
                BindingFlags.Static, null, null, new object [] {});

            // BindingFlags.InvokeMethod
            // Call an instance method.
            TestClass c = new TestClass ();
            Console.WriteLine();
            Console.WriteLine("Invoking an instance method.");
            Console.WriteLine("----------------------------");
            c.GetType().InvokeMember ("AddUp", BindingFlags.InvokeMethod, null, c, new object [] {});
            c.GetType().InvokeMember ("AddUp", BindingFlags.InvokeMethod, null, c, new object [] {});

            // BindingFlags.InvokeMethod
            // Call a method with parameters.
            object [] args = new object [] {100.09, 184.45};
            object result;
            Console.WriteLine();
            Console.WriteLine("Invoking a method with parameters.");
            Console.WriteLine("---------------------------------");
            result = t.InvokeMember ("ComputeSum", BindingFlags.InvokeMethod, null, null, args);
            Console.WriteLine ("{0} + {1} = {2}", args[0], args[1], result);

            // BindingFlags.GetField, SetField
            Console.WriteLine();
            Console.WriteLine("Invoking a field (getting and setting.)");
            Console.WriteLine("--------------------------------------");
            // Get a field value.
            result = t.InvokeMember ("Name", BindingFlags.GetField, null, c, new object [] {});
            Console.WriteLine ("Name == {0}", result);
            // Set a field.
            t.InvokeMember ("Name", BindingFlags.SetField, null, c, new object [] {"NewName"});
            result = t.InvokeMember ("Name", BindingFlags.GetField, null, c, new object [] {});
            Console.WriteLine ("Name == {0}", result);

            Console.WriteLine();
            Console.WriteLine("Invoking an indexed property (getting and setting.)");
            Console.WriteLine("--------------------------------------------------");
            // BindingFlags.GetProperty
            // Get an indexed property value.
            int  index = 3;
            result = t.InvokeMember ("Item", BindingFlags.GetProperty, null, c, new object [] {index});
            Console.WriteLine ("Item[{0}] == {1}", index, result);
            // BindingFlags.SetProperty
            // Set an indexed property value.
            index = 3;
            t.InvokeMember ("Item", BindingFlags.SetProperty, null, c, new object [] {index, "NewValue"});
            result = t.InvokeMember ("Item", BindingFlags.GetProperty , null, c, new object [] {index});
            Console.WriteLine ("Item[{0}] == {1}", index, result);

            Console.WriteLine();
            Console.WriteLine("Getting a field or property.");
            Console.WriteLine("----------------------------");
            // BindingFlags.GetField
            // Get a field or property.
            result = t.InvokeMember ("Name", BindingFlags.GetField | BindingFlags.GetProperty, null, c,
                new object [] {});
            Console.WriteLine ("Name == {0}", result);
            // BindingFlags.GetProperty
            result = t.InvokeMember ("Value", BindingFlags.GetField | BindingFlags.GetProperty, null, c,
                new object [] {});
            Console.WriteLine ("Value == {0}", result);

            Console.WriteLine();
            Console.WriteLine("Invoking a method with named parameters.");
            Console.WriteLine("---------------------------------------");
            // BindingFlags.InvokeMethod
            // Call a method using named parameters.
            object[] argValues = new object [] {"Mouse", "Micky"};
            String [] argNames = new String [] {"lastName", "firstName"};
            t.InvokeMember ("PrintName", BindingFlags.InvokeMethod, null, null, argValues, null, null,
                argNames);

            Console.WriteLine();
            Console.WriteLine("Invoking a default member of a type.");
            Console.WriteLine("------------------------------------");
            // BindingFlags.Default
            // Call the default member of a type.
            Type t3 = typeof (TestClass2);
            t3.InvokeMember ("", BindingFlags.InvokeMethod | BindingFlags.Default, null, new TestClass2(),
                new object [] {});

            // BindingFlags.Static, NonPublic, and Public
            // Invoking a member with ref parameters.
            Console.WriteLine();
            Console.WriteLine("Invoking a method with ref parameters.");
            Console.WriteLine("--------------------------------------");
            MethodInfo m = t.GetMethod("Swap");
            args = new object[2];
            args[0] = 1;
            args[1] = 2;
            m.Invoke(new TestClass(),args);
            Console.WriteLine ("{0}, {1}", args[0], args[1]);

            // BindingFlags.CreateInstance
            // Creating an instance with a parameterless constructor.
            Console.WriteLine();
            Console.WriteLine("Creating an instance with a parameterless constructor.");
            Console.WriteLine("------------------------------------------------------");
            object cobj = t.InvokeMember ("TestClass", BindingFlags.Public |
                BindingFlags.Instance | BindingFlags.CreateInstance,
                null, null, new object [] {});
            Console.WriteLine("Instance of {0} created.", cobj.GetType().Name);

            // Creating an instance with a constructor that has parameters.
            Console.WriteLine();
            Console.WriteLine("Creating an instance with a constructor that has parameters.");
            Console.WriteLine("------------------------------------------------------------");
            cobj = t.InvokeMember ("TestClass", BindingFlags.Public |
                BindingFlags.Instance | BindingFlags.CreateInstance,
                null, null, new object [] { "Hello, World!" });
            Console.WriteLine("Instance of {0} created with initial value '{1}'.", cobj.GetType().Name,
                cobj.GetType().InvokeMember("Name", BindingFlags.GetField, null, cobj, null));

            // BindingFlags.DeclaredOnly
            Console.WriteLine();
            Console.WriteLine("DeclaredOnly instance members.");
            Console.WriteLine("------------------------------");
            System.Reflection.MemberInfo[] memInfo =
                t.GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Instance |
                BindingFlags.Public);
            for(int i=0;i<memInfo.Length;i++)
            {
                Console.WriteLine(memInfo[i].Name);
            }

            // BindingFlags.IgnoreCase
            Console.WriteLine();
            Console.WriteLine("Using IgnoreCase and invoking the PrintName method.");
            Console.WriteLine("---------------------------------------------------");
            t.InvokeMember("printname", BindingFlags.IgnoreCase | BindingFlags.Static |
                BindingFlags.Public | BindingFlags.InvokeMethod, null, null, new object[]
                {"Brad","Smith"});

            // BindingFlags.FlattenHierarchy
            Console.WriteLine();
            Console.WriteLine("Using FlattenHierarchy to get inherited static protected and public members." );
            Console.WriteLine("----------------------------------------------------------------------------");
            FieldInfo[] finfos = typeof(MostDerived).GetFields(BindingFlags.NonPublic | BindingFlags.Public |
                  BindingFlags.Static | BindingFlags.FlattenHierarchy);
            foreach (FieldInfo finfo in finfos)
            {
                Console.WriteLine("{0} defined in {1}.", finfo.Name, finfo.DeclaringType.Name);
            }

            Console.WriteLine();
            Console.WriteLine("Without FlattenHierarchy." );
            Console.WriteLine("-------------------------");
            finfos = typeof(MostDerived).GetFields(BindingFlags.NonPublic | BindingFlags.Public |
                  BindingFlags.Static);
            foreach (FieldInfo finfo in finfos)
            {
                Console.WriteLine("{0} defined in {1}.", finfo.Name, finfo.DeclaringType.Name);
            }
        }
    }

    public class TestClass
    {
        public String Name;
        private Object [] values = new Object [] {0, 1,2,3,4,5,6,7,8,9};

        public Object this [int index]
        {
            get
            {
                return values[index];
            }
            set
            {
                values[index] = value;
            }
        }

        public Object Value
        {
            get
            {
                return "the value";
            }
        }

        public TestClass () : this("initialName") {}
        public TestClass (string initName)
        {
            Name = initName;
        }

        int methodCalled = 0;

        public static void SayHello ()
        {
            Console.WriteLine ("Hello");
        }

        public void AddUp ()
        {
            methodCalled++;
            Console.WriteLine ("AddUp Called {0} times", methodCalled);
        }

        public static double ComputeSum (double d1, double d2)
        {
            return d1 + d2;
        }

        public static void PrintName (String firstName, String lastName)
        {
            Console.WriteLine ("{0},{1}", lastName,firstName);
        }

        public void PrintTime ()
        {
            Console.WriteLine (DateTime.Now);
        }

        public void Swap(ref int a, ref int b)
        {
            int x = a;
            a = b;
            b = x;
        }
    }

    [DefaultMemberAttribute ("PrintTime")]
    public class TestClass2
    {
        public void PrintTime ()
        {
            Console.WriteLine (DateTime.Now);
        }
    }

    public class Base
    {
        static int BaseOnlyPrivate = 0;
        protected static int BaseOnly = 0;
    }
    public class Derived : Base
    {
        public static int DerivedOnly = 0;
    }
    public class MostDerived : Derived {}
}

/* This example produces output similar to the following:

Invoking a static method.
-------------------------
Hello

Invoking an instance method.
----------------------------
AddUp Called 1 times
AddUp Called 2 times

Invoking a method with parameters.
---------------------------------
100.09 + 184.45 = 284.54

Invoking a field (getting and setting.)
--------------------------------------
Name == initialName
Name == NewName

Invoking an indexed property (getting and setting.)
--------------------------------------------------
Item[3] == 3
Item[3] == NewValue

Getting a field or property.
----------------------------
Name == NewName
Value == the value

Invoking a method with named parameters.
---------------------------------------
Mouse,Micky

Invoking a default member of a type.
------------------------------------
12/23/2009 4:29:21 PM

Invoking a method with ref parameters.
--------------------------------------
2, 1

Creating an instance with a parameterless constructor.
------------------------------------------------------
Instance of TestClass created.

Creating an instance with a constructor that has parameters.
------------------------------------------------------------
Instance of TestClass created with initial value 'Hello, World!'.

DeclaredOnly instance members.
------------------------------
get_Item
set_Item
get_Value
AddUp
PrintTime
Swap
.ctor
.ctor
Item
Value
Name

Using IgnoreCase and invoking the PrintName method.
---------------------------------------------------
Smith,Brad

Using FlattenHierarchy to get inherited static protected and public members.
----------------------------------------------------------------------------
DerivedOnly defined in Derived.
BaseOnly defined in Base.

Without FlattenHierarchy.
-------------------------

 */

Комментарии

Эти BindingFlags привязки элементов управления для большого Systemколичества классов в пространствах имен , System.Reflectionи System.Runtime , которые вызывают, создают, получают, задают и находят члены и типы.

BindingFlags используются в следующих Type методах и других местах, таких как MethodBase.Invoke:

InvokeMember и GetMethod имеют особенно важное значение.

Флаги привязки можно классифицировать по тому, как они идентифицируют член типа, как показано в следующей таблице.

Определяется специальными возможностями Определяется аргументом привязки Определяется операцией
DeclaredOnly

FlattenHierarchy

IgnoreCase

IgnoreReturn

Экземпляр

NonPublic

Общие

Статические
ExactBinding

OptionalParamBinding
CreateInstance

GetField

SetField

Getproperty

SetProperty

InvokeMethod

PutDispProperty

PutRefDispProperty

Примечание

Необходимо указать Instance или Static вместе с Public или NonPublic или не будут возвращены члены.

В следующей таблице перечислены приведения, выполняемые по умолчанию Binder.ChangeType. Эта таблица особенно применима к флагу привязки BindingFlags.ExactBinding . Общий принцип заключается в том, что ChangeType должен выполнять только расширяющие приведения, которые никогда не теряют данные. Примером расширяющегося приведения является приведение значения, представляющее собой 32-разрядное целое число со знаком, к значению, которое является 64-разрядным целым числом со знаком. Это отличается от сужающего приведения, которое может потерять данные. Примером сужающего приведения является приведение 64-разрядного целого числа со знаком к 32-разрядному целому числу со знаком.

Тип источника Тип целевого объекта
Любой тип Его базовый тип.
Любой тип Интерфейс, который он реализует.
Char UInt16, UInt32, Int32, UInt64, Int64, Single, Double
Byte Char, UInt16, Int16, UInt32, Int32, UInt64, Int64, Single, Double
SByte Int16, Int32, Int64, Single, Double
UInt16 UInt32, Int32, UInt64, Int64, Single, Double
Int16 Int32, Int64, Single, Double
UInt32 UInt64, Int64, Single, Double
Int32 Int64, Single, Double
UInt64 Single, Double
Int64 Single, Double
Single Double
Без ссылок По ссылке.

При использовании флага привязки BindingFlags.ExactBinding отражение моделирует правила специальных возможностей системы общих типов. Например, если вызывающий объект находится в той же сборке, вызывающий объект не нуждается в специальных разрешениях для внутренних членов. В противном случае вызывающему объекту потребуется ReflectionPermission. Это согласуется с поиском защищенных, закрытых и т. д.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.5, 1.6, 2.0, 2.1
UWP 10.0