Type.InvokeMember Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Geçerli Typeöğesinin belirli bir üyesini çağırır.
Aşırı Yüklemeler
| Name | Description |
|---|---|
| InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen bağlama kısıtlamalarını kullanarak ve belirtilen bağımsız değişken listesi, değiştiriciler ve kültürle eşleşen belirtilen üyeyi çağırır. |
| InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Belirtilen bağlama kısıtlamalarını kullanarak ve belirtilen bağımsız değişken listesi ve kültürüyle eşleşen belirtilen üyeyi çağırır. |
| InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Belirtilen bağlama kısıtlamalarını kullanarak ve belirtilen bağımsız değişken listesiyle eşleşen belirtilen üyeyi çağırır. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
Türetilmiş bir sınıfta geçersiz kılındığında, belirtilen bağlama kısıtlamalarını kullanarak ve belirtilen bağımsız değişken listesi, değiştiriciler ve kültürle eşleşen belirtilen üyeyi çağırır.
public:
abstract System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, cli::array <System::Reflection::ParameterModifier> ^ modifiers, System::Globalization::CultureInfo ^ culture, cli::array <System::String ^> ^ namedParameters);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public abstract object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public abstract object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
public abstract object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters);
public abstract object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
Public MustOverride Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), modifiers As ParameterModifier(), culture As CultureInfo, namedParameters As String()) As Object
Parametreler
- name
- String
Çağrılacak oluşturucunun, yöntemin, özelliğin veya alan üyesinin adını içeren dize.
-veya-
Varsayılan üyeyi çağırmak için boş bir dize ("").
-veya-
Üyeler için IDispatch DispID'yi temsil eden bir dize, örneğin "[DispID=3]".
- invokeAttr
- BindingFlags
Aramanın nasıl yapıldığını belirten numaralandırma değerlerinin bit düzeyinde birleşimi. Erişim , , NonPublic, PrivateInvokeMethod, , GetFieldvb. gibi Publicbir BindingFlags erişim olabilir. Arama türü belirtilmemelidir. Arama türü atlanırsa kullanılırBindingFlags.PublicBindingFlags.Static | BindingFlags.Instance | .
- binder
- Binder
Aşırı yüklenmiş bir yöntemin seçilmesini, bağımsız değişken türlerinin zorlamasını ve yansıma aracılığıyla bir üyenin çağrılmasına neden olabilecek bir özellik kümesini tanımlayan ve bağlamayı etkinleştiren nesne.
-veya-
DefaultBinder kullanmak için null başvuru (Visual Basic hiçbir şey). Değişken bağımsız değişkenleriyle yöntem aşırı yüklemelerini başarıyla çağırmak için bir Binder nesneyi açıkça tanımlamanın gerekebileceğini unutmayın.
- target
- Object
Belirtilen üyenin çağrıldığı nesne.
- args
- Object[]
Çağrılacak üyeye geçirilmesi gereken bağımsız değişkenleri içeren bir dizi.
- modifiers
- ParameterModifier[]
Dizideki ParameterModifier ilgili öğeyle args ilişkili öznitelikleri temsil eden bir nesne dizisi. Parametrenin ilişkili öznitelikleri üyenin imzasında depolanır.
Varsayılan bağlayıcı bu parametreyi yalnızca BIR COM bileşeni çağırırken işler.
- culture
- CultureInfo
CultureInfo Kullanılacak genelleştirme yerel ayarını temsil eden nesne; sayısal dizeyi Çifte dönüştürme gibi yerel ayara özgü dönüştürmeler için gerekli olabilir.
-veya-
Geçerli iş parçacığının CultureInfo kullanmak için null başvuru (Visual Basic Nothing).
- namedParameters
- String[]
Dizideki değerlerin args geçirildiği parametrelerin adlarını içeren bir dizi.
Döndürülenler
Çağrılan üyenin dönüş değerini temsil eden bir nesne.
Uygulamalar
- Öznitelikler
Özel durumlar
invokeAttr içermez CreateInstance ve name şeklindedir null.
args ve modifiers aynı uzunlukta değildir.
-veya-
invokeAttr geçerli BindingFlags bir öznitelik değil.
-veya-
invokeAttr şu bağlama bayraklarından birini içermez: InvokeMethod, CreateInstance, GetField, SetField, , GetPropertyveya SetProperty.
-veya-
invokeAttr, , GetField, SetFieldGetPropertyveya SetPropertyile InvokeMethodbirleştirilmiş içerirCreateInstance.
-veya-
invokeAttrhem SetFieldhem de GetField içerir.
-veya-
invokeAttrhem SetPropertyhem de GetProperty içerir.
-veya-
invokeAttrveya SetPropertyile SetField birlikte içerirInvokeMethod.
-veya-
invokeAttr içerir SetField ve args birden fazla öğeye sahiptir.
-veya-
Adlandırılmış parametre dizisi, bağımsız değişken dizisinden daha büyüktür.
-veya-
Bu yöntem bir COM nesnesinde çağrılır ve şu bağlama bayraklarından biri içinde geçirilmedi: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispPropertyveya BindingFlags.PutRefDispProperty.
-veya-
Adlandırılmış parametre dizilerinden biri olan nullbir dize içerir.
Belirtilen üye bir sınıf başlatıcısı.
Alan veya özellik bulunamıyor.
içindeki argsbağımsız değişkenlerle eşleşen hiçbir yöntem bulunamıyor.
-veya-
içinde bağımsız değişken adlarının sağlandığından namedParametershiçbir üye bulunamaz.
-veya-
Geçerli Type nesne, açık tür parametreleri içeren bir türü temsil eder, ContainsGenericParameters yani döndürür true.
Belirtilen üye üzerinde targetçağrılamaz.
Bağlama ölçütleri ile birden fazla yöntem eşleşir.
tarafından name temsil edilen yöntemin bir veya daha fazla belirtilmemiş genel tür parametresi vardır. Başka bir ifadeyle, yönteminin ContainsGenericParameters özelliği döndürür true.
Açıklamalar
InvokeMember bir oluşturucu üyesini veya yöntem üyesini çağırır, bir özellik üyesi alır veya ayarlar, veri alanı üyesi alır veya ayarlar ya da dizi üyesinin bir öğesini alır veya ayarlar.
Uyarı
Genel bir yöntemi çağırmak için kullanamazsınız InvokeMember .
Bir IDispatch üyeyi çağırdığınızda, "[DispID=##]" dize biçimini kullanarak üye adı yerine DispID belirtebilirsiniz. Örneğin, MyComMethod'un DispID değeri 3 ise, "MyComMethod" yerine "[DispID=3]" dizesini belirtebilirsiniz. Bir üyeyi DispID ile çağırmak, üyeyi ada göre aramaktan daha hızlıdır. Karmaşık toplama senaryolarında DispID bazen istenen üyeyi çağırmanın tek yoludur.
Varsayılan bağlayıcı veya CultureInfo 'yi (modifiersve culture parametreleri) işlemese ParameterModifier de, ve cultureişleyebilen modifiers özel bir bağlayıcı yazmak için soyut System.Reflection.Binder sınıfını kullanabilirsiniz.
ParameterModifier yalnızca COM birlikte çalışması aracılığıyla yapılan çağrılarda kullanılır ve yalnızca referansla geçirilen parametreler işlenir.
Dizideki namedParameters her parametre, dizideki karşılık gelen öğedeki args değeri alır. uzunluğu değerinden argsnamedParametersbüyükse, kalan bağımsız değişken değerleri sırayla geçirilir.
Dizi, namedParameters bir giriş dizisindeki bağımsız değişkenlerin sırasını değiştirmek için kullanılabilir. Örneğin, M(string a, int b) (Visual Basic'da M(ByVal a As String, ByVal b As Integer)) yöntemi ve { 42, "x" } giriş dizisi göz önünde bulundurulduğunda, namedParameters için dizi { "b", "a" } sağlanıyorsa giriş dizisi args'a değiştirilmemiş olarak geçirilebilir.
Aşağıdaki BindingFlags filtre bayrakları, aramaya hangi üyelerin dahil edilebileceğini tanımlamak için kullanılabilir:
Genel üyeleri aramaya dahil etmek için belirtin
BindingFlags.Public.Genel olmayan üyeleri (özel, iç ve korumalı üyeler) aramaya dahil etmek için belirtin
BindingFlags.NonPublic.Hiyerarşiye statik üyeleri eklemek için belirtin
BindingFlags.FlattenHierarchy.
Aramanın çalışma biçimini değiştirmek için aşağıdaki BindingFlags değiştirici bayraklar kullanılabilir:
BindingFlags.IgnoreCaseöğesinin büyük/küçük harf durumununameyoksaymak için.BindingFlags.DeclaredOnlyyalnızca üzerinde Typebildirilen üyeleri aramak için yalnızca devralınan üyeleri aramaz.
Üyeyle gerçekleştirilecek eylemi belirtmek için aşağıdaki BindingFlags çağırma bayrakları kullanılabilir:
CreateInstancebir oluşturucu çağırmak için.namegöz ardı edilir. Diğer çağırma bayraklarıyla geçerli değil.InvokeMethodbir yöntemi çağırmak için, ancak bir oluşturucuyu veya tür başlatıcıyı çağırmaz. veyaSetPropertyileSetFieldgeçerli değil. Kendi başına belirtilirseInvokeMethod,BindingFlags.Public,BindingFlags.InstanceveBindingFlags.Staticotomatik olarak eklenir.GetFieldbir alanın değerini almak için. ileSetFieldgeçerli değil.SetFieldbir alanın değerini ayarlamak için. ileGetFieldgeçerli değil.GetPropertybir özellik almak için. ileSetPropertygeçerli değil.SetPropertybir özellik ayarlamak için. ileGetPropertygeçerli değil.
Daha fazla bilgi için bkz. System.Reflection.BindingFlags.
Aşağıdaki koşulların her ikisi de doğruysa bir yöntem çağrılır:
Yöntem bildirimindeki parametre sayısı dizideki
argsbağımsız değişkenlerin sayısına eşittir (üyede varsayılan bağımsız değişkenler tanımlanmadığı veBindingFlags.OptionalParamBindingbelirtilmediği sürece).Her bağımsız değişkenin türü bağlayıcı tarafından parametre türüne dönüştürülebilir.
Bağlayıcı tüm eşleşen yöntemleri bulur. Bu yöntemler, istenen bağlama türüne (BindingFlags değerler InvokeMethod, GetPropertyvb.) göre bulunur. Yöntem kümesi, ad, bağımsız değişken sayısı ve bağlayıcıda tanımlanan bir arama değiştirici kümesine göre filtrelenmiştir.
Yöntemi seçildikten sonra çağrılır. Erişilebilirlik bu noktada denetlendi. Arama, yöntemiyle ilişkili erişilebilirlik özniteliğine göre hangi yöntem kümesinin aranabileceğini denetleyebilir. Binder.BindToMethod sınıfının yöntemiBinder, çağrılacak yöntemi seçmekle sorumludur. Varsayılan bağlayıcı en özel eşleşmeyi seçer.
InvokeMember , varsayılan değerlere sahip parametrelere sahip yöntemleri çağırmak için kullanılabilir. Bu yöntemlere bağlanmak için Yansıma belirtilmesi gerekir BindingFlags.OptionalParamBinding . Varsayılan değeri olan bir parametre için farklı bir değer sağlayabilir veya varsayılan değeri kullanmak için sağlayabilirsiniz Missing.Value .
Örneğin, MyMethod(int x, float y = 2.0) gibi bir yöntem düşünün. Bu yöntemi yalnızca myMethod(4) olarak ilk bağımsız değişkenle çağırmak için yukarıdaki bağlama bayraklarından birini geçirin ve ilk bağımsız değişken için 4 ve ikinci bağımsız değişken Missing.Value için iki bağımsız değişken geçirin. kullanmadığınız Missing.Valuesürece, yöntemiyle Invoke isteğe bağlı parametreleri atlayamayabilirsiniz. Bunu yapmanız gerekiyorsa, bunun yerine kullanın InvokeMember .
Tam güvenilir kod için erişim kısıtlamaları yoksayılır; yani özel oluşturucular, yöntemler, alanlar ve özellikler koda tam olarak güvenildiğinde aracılığıyla System.Reflection erişilebilir ve çağrılabilir.
alanını belirterek BindingFlags.SetFieldbelirli bir değere ayarlamak için kullanabilirsinizType.InvokeMember. Örneğin, C sınıfında F adlı bir genel örnek alanı ayarlamak istiyorsanız ve F bir Stringise, aşağıdaki gibi bir kod kullanabilirsiniz:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);
F bir String[]ise, aşağıdaki gibi bir kod kullanabilirsiniz:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);
F alanını bu yeni diziye başlatacaktır. Değerin dizinini ve ardından aşağıdaki gibi bir kod kullanarak sonraki değeri sağlayarak dizide bir konum ayarlamak için de kullanabilirsiniz Type.InvokeMember :
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Bu, F'nin tuttuğu dizideki "z" dizesini "b" dizesi olarak değiştirir.
Uyarı
Bu yöntem, çağıranın bayrağıyla verilmiş ReflectionPermission olması ve genel olmayan üyelerin izin kümesinin çağıranın izin kümesiyle veya bunun bir alt kümesiyle ReflectionPermissionFlag.RestrictedMemberAccess sınırlı olması durumunda genel olmayan üyelere erişmek için kullanılabilir. (Bkz. Yansıma için GüvenlikLe İlgili Önemli Noktalar.)
Bu işlevselliği kullanmak için uygulamanızın .NET Framework 3.5 veya sonraki bir sürümü hedeflemesi gerekir.
Ayrıca bkz.
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Şunlara uygulanır
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
Belirtilen bağlama kısıtlamalarını kullanarak ve belirtilen bağımsız değişken listesi ve kültürüyle eşleşen belirtilen üyeyi çağırır.
public:
System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
public:
virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
public object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Globalization.CultureInfo culture);
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), culture As CultureInfo) As Object
Parametreler
- name
- String
Çağrılacak oluşturucunun, yöntemin, özelliğin veya alan üyesinin adını içeren dize.
-veya-
Varsayılan üyeyi çağırmak için boş bir dize ("").
-veya-
Üyeler için IDispatch DispID'yi temsil eden bir dize, örneğin "[DispID=3]".
- invokeAttr
- BindingFlags
Aramanın nasıl yapıldığını belirten numaralandırma değerlerinin bit düzeyinde birleşimi. Erişim , , NonPublic, PrivateInvokeMethod, , GetFieldvb. gibi Publicbir BindingFlags erişim olabilir. Arama türü belirtilmemelidir. Arama türü atlanırsa kullanılırBindingFlags.PublicBindingFlags.Static | BindingFlags.Instance | .
- binder
- Binder
Aşırı yüklenmiş bir yöntemin seçilmesini, bağımsız değişken türlerinin zorlamasını ve yansıma aracılığıyla bir üyenin çağrılmasına neden olabilecek bir özellik kümesini tanımlayan ve bağlamayı etkinleştiren nesne.
-veya-
DefaultBinder kullanmak için null başvuru (Visual Basic'de Nothing). Değişken bağımsız değişkenleriyle yöntem aşırı yüklemelerini başarıyla çağırmak için bir Binder nesneyi açıkça tanımlamanın gerekebileceğini unutmayın.
- target
- Object
Belirtilen üyenin çağrıldığı nesne.
- args
- Object[]
Çağrılacak üyeye geçirilmesi gereken bağımsız değişkenleri içeren bir dizi.
- culture
- CultureInfo
Kullanılacak genelleştirme yerel ayarını temsil eden nesne, yerel ayara özgü dönüştürmeler için gerekli olabilir( örneğin, bir sayısalı StringDoubleöğesine dönüştürme).
-veya-
Geçerli iş parçacığının CultureInfo kullanmak için null başvuru (Visual Basic Nothing).
Döndürülenler
Çağrılan üyenin dönüş değerini temsil eden bir nesne.
Uygulamalar
- Öznitelikler
Özel durumlar
invokeAttr içermez CreateInstance ve name şeklindedir null.
invokeAttr geçerli BindingFlags bir öznitelik değil.
-veya-
invokeAttr şu bağlama bayraklarından birini içermez: InvokeMethod, CreateInstance, GetField, SetField, , GetPropertyveya SetProperty.
-veya-
invokeAttr, , GetField, SetFieldGetPropertyveya SetPropertyile InvokeMethodbirleştirilmiş içerirCreateInstance.
-veya-
invokeAttrhem SetFieldhem de GetField içerir.
-veya-
invokeAttrhem SetPropertyhem de GetProperty içerir.
-veya-
invokeAttrveya SetPropertyile SetField birlikte içerirInvokeMethod.
-veya-
invokeAttr içerir SetField ve args birden fazla öğeye sahiptir.
-veya-
Bu yöntem bir COM nesnesinde çağrılır ve şu bağlama bayraklarından biri içinde geçirilmedi: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispPropertyveya BindingFlags.PutRefDispProperty.
-veya-
Adlandırılmış parametre dizilerinden biri olan nullbir dize içerir.
Belirtilen üye bir sınıf başlatıcısı.
Alan veya özellik bulunamıyor.
içindeki argsbağımsız değişkenlerle eşleşen hiçbir yöntem bulunamıyor.
-veya-
Geçerli Type nesne, açık tür parametreleri içeren bir türü temsil eder, ContainsGenericParameters yani döndürür true.
Belirtilen üye üzerinde targetçağrılamaz.
Bağlama ölçütleri ile birden fazla yöntem eşleşir.
tarafından name temsil edilen yöntemin bir veya daha fazla belirtilmemiş genel tür parametresi vardır. Başka bir ifadeyle, yönteminin ContainsGenericParameters özelliği döndürür true.
Açıklamalar
Varsayılan bağlayıcı CultureInfo ( culture parametresi) işlemezken, System.Reflection.Binder işlemek için soyut culture sınıfını kullanarak özel bir bağlayıcı yazabilirsiniz.
Uyarı
Genel bir yöntemi çağırmak için kullanamazsınız InvokeMember .
Aşağıdaki BindingFlags filtre bayrakları, aramaya hangi üyelerin dahil edilebileceğini tanımlamak için kullanılabilir:
Genel üyeleri aramaya dahil etmek için belirtin
BindingFlags.Public.Genel olmayan üyeleri (özel, iç ve korumalı üyeler) aramaya dahil etmek için belirtin
BindingFlags.NonPublic.Hiyerarşiye statik üyeleri eklemek için belirtin
BindingFlags.FlattenHierarchy.
Aramanın çalışma biçimini değiştirmek için aşağıdaki BindingFlags değiştirici bayraklar kullanılabilir:
BindingFlags.IgnoreCaseöğesinin büyük/küçük harf durumununameyoksaymak için.BindingFlags.DeclaredOnlyyalnızca üzerinde Typebildirilen üyeleri aramak için yalnızca devralınan üyeleri aramaz.
Üyeyle gerçekleştirilecek eylemi belirtmek için aşağıdaki BindingFlags çağırma bayrakları kullanılabilir:
CreateInstancebir oluşturucu çağırmak için.namegöz ardı edilir. Diğer çağırma bayraklarıyla geçerli değil.InvokeMethodbir yöntemi çağırmak için, ancak bir oluşturucuyu veya tür başlatıcıyı çağırmaz. veyaSetPropertyileSetFieldgeçerli değil. Kendi başına belirtilirseInvokeMethod,BindingFlags.Public,BindingFlags.InstanceveBindingFlags.Staticotomatik olarak eklenir.GetFieldbir alanın değerini almak için. ileSetFieldgeçerli değil.SetFieldbir alanın değerini ayarlamak için. ileGetFieldgeçerli değil.GetPropertybir özellik almak için. ileSetPropertygeçerli değil.SetPropertybir özellik ayarlamak için. ileGetPropertygeçerli değil.
Daha fazla bilgi için bkz. System.Reflection.BindingFlags.
Aşağıdaki koşulların her ikisi de doğruysa bir yöntem çağrılır:
Yöntem bildirimindeki parametre sayısı dizideki
argsbağımsız değişkenlerin sayısına eşittir (üyede varsayılan bağımsız değişkenler tanımlanmadığı veBindingFlags.OptionalParamBindingbelirtilmediği sürece).Her bağımsız değişkenin türü bağlayıcı tarafından parametre türüne dönüştürülebilir.
Bağlayıcı tüm eşleşen yöntemleri bulur. Bu yöntemler, istenen bağlama türüne (BindingFlags değerler InvokeMethod, GetPropertyvb.) göre bulunur. Yöntem kümesi, ad, bağımsız değişken sayısı ve bağlayıcıda tanımlanan bir arama değiştirici kümesine göre filtrelenmiştir.
Yöntemi seçildikten sonra çağrılır. Erişilebilirlik bu noktada denetlendi. Arama, yöntemiyle ilişkili erişilebilirlik özniteliğine göre hangi yöntem kümesinin aranabileceğini denetleyebilir. Binder.BindToMethod sınıfının yöntemiBinder, çağrılacak yöntemi seçmekle sorumludur. Varsayılan bağlayıcı en özel eşleşmeyi seçer.
Tam güvenilir kod için erişim kısıtlamaları yoksayılır; yani özel oluşturuculara, yöntemlere, alanlara ve özelliklere, koda tam olarak güvenildiğinde Yansıma aracılığıyla erişilebilir ve çağrılabilir.
alanını belirterek BindingFlags.SetFieldbelirli bir değere ayarlamak için kullanabilirsinizType.InvokeMember. Örneğin, C sınıfında F adlı bir genel örnek alanı ayarlamak istiyorsanız ve F ise aşağıdaki gibi bir String kod kullanabilirsiniz:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);
F bir String[]ise, aşağıdaki gibi bir kod kullanabilirsiniz:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
F alanını bu yeni diziye başlatacaktır. Değerin dizinini ve ardından aşağıdaki gibi bir kod kullanarak sonraki değeri sağlayarak dizide bir konum ayarlamak için de kullanabilirsiniz Type.InvokeMember :
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Bu, F'nin tuttuğu dizideki "z" dizesini "b" dizesi olarak değiştirir.
Bir IDispatch üyeyi çağırdığınızda, "[DispID=##]" dize biçimini kullanarak üye adı yerine DispID belirtebilirsiniz. Örneğin, MyComMethod'un DispID değeri 3 ise, "MyComMethod" yerine "[DispID=3]" dizesini belirtebilirsiniz. Bir üyeyi DispID ile çağırmak, üyeyi ada göre aramaktan daha hızlıdır. Karmaşık toplama senaryolarında DispID bazen istenen üyeyi çağırmanın tek yoludur.
Uyarı
Bu yöntem, çağıranın bayrağıyla verilmiş ReflectionPermission olması ve genel olmayan üyelerin izin kümesinin çağıranın izin kümesiyle veya bunun bir alt kümesiyle ReflectionPermissionFlag.RestrictedMemberAccess sınırlı olması durumunda genel olmayan üyelere erişmek için kullanılabilir. (Bkz. Yansıma için GüvenlikLe İlgili Önemli Noktalar.)
Bu işlevselliği kullanmak için uygulamanızın .NET Framework 3.5 veya sonraki bir sürümü hedeflemesi gerekir.
Ayrıca bkz.
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Şunlara uygulanır
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
- Kaynak:
- Type.cs
Belirtilen bağlama kısıtlamalarını kullanarak ve belirtilen bağımsız değişken listesiyle eşleşen belirtilen üyeyi çağırır.
public:
System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
public:
virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
public object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args);
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object()) As Object
Parametreler
- name
- String
Çağrılacak oluşturucunun, yöntemin, özelliğin veya alan üyesinin adını içeren dize.
-veya-
Varsayılan üyeyi çağırmak için boş bir dize ("").
-veya-
Üyeler için IDispatch DispID'yi temsil eden bir dize, örneğin "[DispID=3]".
- invokeAttr
- BindingFlags
Aramanın nasıl yapıldığını belirten numaralandırma değerlerinin bit düzeyinde birleşimi. Erişim , , NonPublic, PrivateInvokeMethod, , GetFieldvb. gibi Publicbir BindingFlags erişim olabilir. Arama türü belirtilmemelidir. Arama türü atlanırsa kullanılırBindingFlags.PublicBindingFlags.Static | BindingFlags.Instance | .
- binder
- Binder
Aşırı yüklenmiş bir yöntemin seçilmesini, bağımsız değişken türlerinin zorlamasını ve yansıma aracılığıyla bir üyenin çağrılmasına neden olabilecek bir özellik kümesini tanımlayan ve bağlamayı etkinleştiren nesne.
-veya-
DefaultBinder kullanmak için null başvuru (Visual Basic'de Nothing). Değişken bağımsız değişkenleriyle yöntem aşırı yüklemelerini başarıyla çağırmak için bir Binder nesneyi açıkça tanımlamanın gerekebileceğini unutmayın.
- target
- Object
Belirtilen üyenin çağrıldığı nesne.
- args
- Object[]
Çağrılacak üyeye geçirilmesi gereken bağımsız değişkenleri içeren bir dizi.
Döndürülenler
Çağrılan üyenin dönüş değerini temsil eden bir nesne.
Uygulamalar
- Öznitelikler
Özel durumlar
invokeAttr içermez CreateInstance ve name şeklindedir null.
invokeAttr geçerli BindingFlags bir öznitelik değil.
-veya-
invokeAttr şu bağlama bayraklarından birini içermez: InvokeMethod, CreateInstance, GetField, SetField, , GetPropertyveya SetProperty.
-veya-
invokeAttr, , GetField, SetFieldGetPropertyveya SetPropertyile InvokeMethodbirleştirilmiş içerirCreateInstance.
-veya-
invokeAttrhem SetFieldhem de GetField içerir.
-veya-
invokeAttrhem SetPropertyhem de GetProperty içerir.
-veya-
invokeAttrveya SetPropertyile SetField birlikte içerirInvokeMethod.
-veya-
invokeAttr içerir SetField ve args birden fazla öğeye sahiptir.
-veya-
Bu yöntem bir COM nesnesinde çağrılır ve şu bağlama bayraklarından biri içinde geçirilmedi: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispPropertyveya BindingFlags.PutRefDispProperty.
-veya-
Adlandırılmış parametre dizilerinden biri olan nullbir dize içerir.
Belirtilen üye bir sınıf başlatıcısı.
Alan veya özellik bulunamıyor.
içindeki argsbağımsız değişkenlerle eşleşen hiçbir yöntem bulunamıyor.
-veya-
Geçerli Type nesne, açık tür parametreleri içeren bir türü temsil eder, ContainsGenericParameters yani döndürür true.
Belirtilen üye üzerinde targetçağrılamaz.
Bağlama ölçütleri ile birden fazla yöntem eşleşir.
.NET Compact Framework şu anda bu yöntemi desteklemiyor.
tarafından name temsil edilen yöntemin bir veya daha fazla belirtilmemiş genel tür parametresi vardır. Başka bir ifadeyle, yönteminin ContainsGenericParameters özelliği döndürür true.
Örnekler
Aşağıdaki örnek, bir türün üyelerine erişmek için kullanır InvokeMember .
using System;
using System.Reflection;
// This sample class has a field, constructor, method, and property.
class MyType
{
Int32 myField;
public MyType(ref Int32 x) {x *= 5;}
public override String ToString() {return myField.ToString();}
public Int32 MyProp
{
get {return myField;}
set
{
if (value < 1)
throw new ArgumentOutOfRangeException("value", value, "value must be > 0");
myField = value;
}
}
}
class MyApp
{
static void Main()
{
Type t = typeof(MyType);
// Create an instance of a type.
Object[] args = new Object[] {8};
Console.WriteLine("The value of x before the constructor is called is {0}.", args[0]);
Object obj = t.InvokeMember(null,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
Console.WriteLine("Type: " + obj.GetType().ToString());
Console.WriteLine("The value of x after the constructor returns is {0}.", args[0]);
// Read and write to a field.
t.InvokeMember("myField",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] {5});
Int32 v = (Int32) t.InvokeMember("myField",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetField, null, obj, null);
Console.WriteLine("myField: " + v);
// Call a method.
String s = (String) t.InvokeMember("ToString",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
Console.WriteLine("ToString: " + s);
// Read and write a property. First, attempt to assign an
// invalid value; then assign a valid value; finally, get
// the value.
try
{
// Assign the value zero to MyProp. The Property Set
// throws an exception, because zero is an invalid value.
// InvokeMember catches the exception, and throws
// TargetInvocationException. To discover the real cause
// you must catch TargetInvocationException and examine
// the inner exception.
t.InvokeMember("MyProp",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {0});
}
catch (TargetInvocationException e)
{
// If the property assignment failed for some unexpected
// reason, rethrow the TargetInvocationException.
if (e.InnerException.GetType() !=
typeof(ArgumentOutOfRangeException))
throw;
Console.WriteLine("An invalid value was assigned to MyProp.");
}
t.InvokeMember("MyProp",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {2});
v = (Int32) t.InvokeMember("MyProp",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null);
Console.WriteLine("MyProp: " + v);
}
}
open System
open System.Reflection
// This sample class has a field, constructor, method, and property.
type MyType() =
let mutable myField = 0
member _.MyType(x: int byref) =
x <- x * 5
override _.ToString() =
string myField
member _.MyProp
with get () = myField
and set value =
if value < 1 then
raise (ArgumentOutOfRangeException("value", value, "value must be > 0"))
myField <- value
let t = typeof<MyType>
// Create an instance of a type.
let args = Array.zeroCreate<obj> 8
printfn $"The value of x before the constructor is called is {args[0]}."
let obj = t.InvokeMember(null,
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.CreateInstance, null, null, args)
printfn $"Type: {obj.GetType()}"
printfn $"The value of x after the constructor returns is {args[0]}."
// Read and write to a field.
t.InvokeMember("myField",
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.SetField, null, obj, Array.zeroCreate<obj> 5) |> ignore
let v = t.InvokeMember("myField",
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.GetField, null, obj, null) :?> int
printfn $"myField: {v}"
// Call a method.
let s = t.InvokeMember("ToString",
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.InvokeMethod, null, obj, null) :?> string
printfn $"ToString: {s}"
// Read and write a property. First, attempt to assign an
// invalid value then assign a valid value finally, get
// the value.
try
// Assign the value zero to MyProp. The Property Set
// throws an exception, because zero is an invalid value.
// InvokeMember catches the exception, and throws
// TargetInvocationException. To discover the real cause
// you must catch TargetInvocationException and examine
// the inner exception.
t.InvokeMember("MyProp",
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 0) |> ignore
with :? TargetInvocationException as e ->
// If the property assignment failed for some unexpected
// reason, rethrow the TargetInvocationException.
if e.InnerException.GetType() <> typeof<ArgumentOutOfRangeException> then
reraise ()
printfn "An invalid value was assigned to MyProp."
t.InvokeMember("MyProp",
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 2) |> ignore
let v2 = t.InvokeMember("MyProp",
BindingFlags.DeclaredOnly |||
BindingFlags.Public ||| BindingFlags.NonPublic |||
BindingFlags.Instance ||| BindingFlags.GetProperty, null, obj, null)
printfn $"MyProp: {v2}"
Imports System.Reflection
' This sample class has a field, constructor, method, and property.
Class MyType
Private myField As Int32
Public Sub New(ByRef x As Int32)
x *= 5
End Sub
Public Overrides Function ToString() As [String]
Return myField.ToString()
End Function 'ToString
Public Property MyProp() As Int32
Get
Return myField
End Get
Set(ByVal Value As Int32)
If Value < 1 Then
Throw New ArgumentOutOfRangeException("value", Value, "value must be > 0")
End If
myField = Value
End Set
End Property
End Class
Class MyApp
Shared Sub Main()
Dim t As Type = GetType(MyType)
' Create an instance of a type.
Dim args() As [Object] = {8}
Console.WriteLine("The value of x before the constructor is called is {0}.", args(0))
Dim obj As [Object] = t.InvokeMember(Nothing, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, Nothing, args)
Console.WriteLine("Type: {0}", obj.GetType().ToString())
Console.WriteLine("The value of x after the constructor returns is {0}.", args(0))
' Read and write to a field.
t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetField, Nothing, obj, New [Object]() {5})
Dim v As Int32 = CType(t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, obj, Nothing), Int32)
Console.WriteLine("myField: {0}", v)
' Call a method.
Dim s As [String] = CType(t.InvokeMember("ToString", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, obj, Nothing), [String])
Console.WriteLine("ToString: {0}", s)
' Read and write a property. First, attempt to assign an
' invalid value; then assign a valid value; finally, get
' the value.
Try
' Assign the value zero to MyProp. The Property Set
' throws an exception, because zero is an invalid value.
' InvokeMember catches the exception, and throws
' TargetInvocationException. To discover the real cause
' you must catch TargetInvocationException and examine
' the inner exception.
t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {0})
Catch e As TargetInvocationException
' If the property assignment failed for some unexpected
' reason, rethrow the TargetInvocationException.
If Not e.InnerException.GetType() Is GetType(ArgumentOutOfRangeException) Then
Throw
End If
Console.WriteLine("An invalid value was assigned to MyProp.")
End Try
t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {2})
v = CType(t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetProperty, Nothing, obj, Nothing), Int32)
Console.WriteLine("MyProp: {0}", v)
End Sub
End Class
Açıklamalar
Uyarı
Genel bir yöntemi çağırmak için kullanamazsınız InvokeMember .
Aşağıdaki BindingFlags filtre bayrakları, aramaya hangi üyelerin dahil edilebileceğini tanımlamak için kullanılabilir:
Genel üyeleri aramaya dahil etmek için belirtin
BindingFlags.Public.Genel olmayan üyeleri (özel ve korumalı üyeler) aramaya dahil etmek için belirtin
BindingFlags.NonPublic.Hiyerarşiye statik üyeleri eklemek için belirtin
BindingFlags.FlattenHierarchy.
Aramanın çalışma biçimini değiştirmek için aşağıdaki BindingFlags değiştirici bayraklar kullanılabilir:
BindingFlags.IgnoreCaseöğesinin büyük/küçük harf durumununameyoksaymak için.BindingFlags.DeclaredOnlyyalnızca üzerinde Typebildirilen üyeleri aramak için yalnızca devralınan üyeleri aramaz.
Üyeyle gerçekleştirilecek eylemi belirtmek için aşağıdaki BindingFlags çağırma bayrakları kullanılabilir:
CreateInstancebir oluşturucu çağırmak için.namegöz ardı edilir. Diğer çağırma bayraklarıyla geçerli değil.InvokeMethodbir yöntemi çağırmak için, ancak bir oluşturucuyu veya tür başlatıcıyı çağırmaz. veyaSetPropertyileSetFieldgeçerli değil. Kendi başına belirtilirseInvokeMethod,BindingFlags.Public,BindingFlags.InstanceveBindingFlags.Staticotomatik olarak eklenir.GetFieldbir alanın değerini almak için. ileSetFieldgeçerli değil.SetFieldbir alanın değerini ayarlamak için. ileGetFieldgeçerli değil.GetPropertybir özellik almak için. ileSetPropertygeçerli değil.SetPropertybir özellik ayarlamak için. ileGetPropertygeçerli değil.
Daha fazla bilgi için bkz. System.Reflection.BindingFlags.
Aşağıdaki koşulların her ikisi de doğruysa bir yöntem çağrılır:
Yöntem bildirimindeki parametre sayısı dizideki
argsbağımsız değişkenlerin sayısına eşittir (üyede varsayılan bağımsız değişkenler tanımlanmadığı veBindingFlags.OptionalParamBindingbelirtilmediği sürece).Her bağımsız değişkenin türü bağlayıcı tarafından parametre türüne dönüştürülebilir.
Bağlayıcı tüm eşleşen yöntemleri bulur. Bu yöntemler, istenen bağlama türüne (BindingFlags değerler InvokeMethod, GetPropertyvb.) göre bulunur. Yöntem kümesi, ad, bağımsız değişken sayısı ve bağlayıcıda tanımlanan bir arama değiştirici kümesine göre filtrelenmiştir.
Yöntemi seçildikten sonra çağrılır. Erişilebilirlik bu noktada denetlendi. Arama, yöntemiyle ilişkili erişilebilirlik özniteliğine göre hangi yöntem kümesinin aranabileceğini denetleyebilir. Binder.BindToMethod sınıfının yöntemiBinder, çağrılacak yöntemi seçmekle sorumludur. Varsayılan bağlayıcı en özel eşleşmeyi seçer.
Tam güvenilir kod için erişim kısıtlamaları yoksayılır; yani özel oluşturucular, yöntemler, alanlar ve özellikler koda tam olarak güvenildiğinde aracılığıyla System.Reflection erişilebilir ve çağrılabilir.
alanını belirterek BindingFlags.SetFieldbelirli bir değere ayarlamak için kullanabilirsinizType.InvokeMember. Örneğin, C sınıfında F adlı bir genel örnek alanı ayarlamak istiyorsanız ve F bir Stringise, aşağıdaki gibi bir kod kullanabilirsiniz:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
F bir String[]ise, aşağıdaki gibi bir kod kullanabilirsiniz:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
F alanını bu yeni diziye başlatacaktır. Değerin dizinini ve ardından aşağıdaki gibi bir kod kullanarak sonraki değeri sağlayarak dizide bir konum ayarlamak için de kullanabilirsiniz Type.InvokeMember :
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Bu, F'nin tuttuğu dizideki "z" dizesini "b" dizesi olarak değiştirir.
Bir IDispatch üyeyi çağırdığınızda, "[DispID=##]" dize biçimini kullanarak üye adı yerine DispID değerini belirtebilirsiniz. Örneğin, MyComMethod'un DispID değeri 3 ise, "MyComMethod" yerine "[DispID=3]" dizesini belirtebilirsiniz. Bir üyeyi DispID ile çağırmak, üyeyi ada göre aramaktan daha hızlıdır. Karmaşık toplama senaryolarında DispID bazen istenen üyeyi çağırmanın tek yoludur.
Uyarı
Bu yöntem, çağıranın bayrağıyla verilmiş ReflectionPermission olması ve genel olmayan üyelerin izin kümesinin çağıranın izin kümesiyle veya bunun bir alt kümesiyle ReflectionPermissionFlag.RestrictedMemberAccess sınırlı olması durumunda genel olmayan üyelere erişmek için kullanılabilir. (Bkz. Yansıma için GüvenlikLe İlgili Önemli Noktalar.)
Bu işlevselliği kullanmak için uygulamanızın .NET Framework 3.5 veya sonraki bir sürümü hedeflemesi gerekir.
Ayrıca bkz.
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission