2014-02-19 5 views
6

Я помню, где-то читал, используя отражение и перегрузку GetMethod, которая принимает битовую маску BindingFlags, что BindingFlags.Default эквивалентно BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance или что-то в этом роде. Может ли кто-нибудь сказать мне, какие значения конкретно включены в BindingFlags.Default? MSDN documentation не говорит, и я не могу найти ответ нигде.Что такое BindingFlags.Default эквивалентно?

ответ

6

Если вы идете к определению "на него, вы увидите:

public enum BindingFlags 
{ 
    // Summary: 
    //  Specifies no binding flag. 
    Default = 0, 
    // 
    // Summary: 
    //  Specifies that the case of the member name should not be considered when 
    //  binding. 
    IgnoreCase = 1, 
    // 
    // Summary: 
    //  Specifies that only members declared at the level of the supplied type's 
    //  hierarchy should be considered. Inherited members are not considered. 
    DeclaredOnly = 2, 
    // 
    // Summary: 
    //  Specifies that instance members are to be included in the search. 
    Instance = 4, 
    // 
    // Summary: 
    //  Specifies that static members are to be included in the search. 
    Static = 8, 
    // 
    // Summary: 
    //  Specifies that public members are to be included in the search. 
    Public = 16, 
    // 
    // Summary: 
    //  Specifies that non-public members are to be included in the search. 
    NonPublic = 32, 
    // 
    // Summary: 
    //  Specifies that public and protected static members up the hierarchy should 
    //  be returned. Private static members in inherited classes are not returned. 
    //  Static members include fields, methods, events, and properties. Nested types 
    //  are not returned. 
    FlattenHierarchy = 64, 
    // 
    // Summary: 
    //  Specifies that a method is to be invoked. This must not be a constructor 
    //  or a type initializer. 
    InvokeMethod = 256, 
    // 
    // Summary: 
    //  Specifies that Reflection should create an instance of the specified type. 
    //  Calls the constructor that matches the given arguments. The supplied member 
    //  name is ignored. If the type of lookup is not specified, (Instance | Public) 
    //  will apply. It is not possible to call a type initializer. 
    CreateInstance = 512, 
    // 
    // Summary: 
    //  Specifies that the value of the specified field should be returned. 
    GetField = 1024, 
    // 
    // Summary: 
    //  Specifies that the value of the specified field should be set. 
    SetField = 2048, 
    // 
    // Summary: 
    //  Specifies that the value of the specified property should be returned. 
    GetProperty = 4096, 
    // 
    // Summary: 
    //  Specifies that the value of the specified property should be set. For COM 
    //  properties, specifying this binding flag is equivalent to specifying PutDispProperty 
    //  and PutRefDispProperty. 
    SetProperty = 8192, 
    // 
    // Summary: 
    //  Specifies that the PROPPUT member on a COM object should be invoked. PROPPUT 
    //  specifies a property-setting function that uses a value. Use PutDispProperty 
    //  if a property has both PROPPUT and PROPPUTREF and you need to distinguish 
    //  which one is called. 
    PutDispProperty = 16384, 
    // 
    // Summary: 
    //  Specifies that the PROPPUTREF member on a COM object should be invoked. PROPPUTREF 
    //  specifies a property-setting function that uses a reference instead of a 
    //  value. Use PutRefDispProperty if a property has both PROPPUT and PROPPUTREF 
    //  and you need to distinguish which one is called. 
    PutRefDispProperty = 32768, 
    // 
    // Summary: 
    //  Specifies that types of the supplied arguments must exactly match the types 
    //  of the corresponding formal parameters. Reflection throws an exception if 
    //  the caller supplies a non-null Binder object, since that implies that the 
    //  caller is supplying BindToXXX implementations that will pick the appropriate 
    //  method. 
    ExactBinding = 65536, 
    // 
    // Summary: 
    //  Not implemented. 
    SuppressChangeType = 131072, 
    // 
    // Summary: 
    //  Returns the set of members whose parameter count matches the number of supplied 
    //  arguments. This binding flag is used for methods with parameters that have 
    //  default values and methods with variable arguments (varargs). This flag should 
    //  only be used with System.Type.InvokeMember(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Object,System.Object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,System.String[]). 
    OptionalParamBinding = 262144, 
    // 
    // Summary: 
    //  Used in COM interop to specify that the return value of the member can be 
    //  ignored. 
    IgnoreReturn = 16777216, 
} 

Итак, это выглядит как BindingFlags.Default != BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance.

+0

Дерп, я не думал об этом. –

+0

@ davidkennedy85 :) – MadSkunk

+0

Я пошел к определению класса и прочитал, что, как вы выяснили, что «Default» эквивалентно tho? – Fred

1

BindingFlags.Default не указывает флаги привязки. Выбор пользователя для перечисления зависит от пользователя перечисления. System.Type.GetMethods(), например, возвращает все общедоступные методы.