在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

動態(tài)裝載與運用分類

動態(tài)裝載與運用分類

更新時間:2019-07-04 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

Reflection提供諸如Microsoft Visual Basic.NET和JScript語言編譯器使用的底層結構來實施隱性后綁定。綁定是定位與某一特定類型相對應的聲明的過程。當這個過程發(fā)生在運行的時候,而不是編譯的時候,它被稱為后綁定。Visual Basic.NET使你可以在你的代碼中使用隱性后綁定;VisualBasic.NET編譯器調用helper 方法,使用Reflection獲得對象類型。傳遞給helper 方法的參數(shù) 使適當?shù)姆椒ǹ梢栽谶\行時被調用。這些參數(shù)是調用方法(對象)的實例,被調用方法的名字(字符串),及傳遞給被調用方法的參數(shù)。(一個對象數(shù)組)。

在以下代碼例子中, Visual Basic.NET編譯器通過Reflection隱性地 來對一在編譯時不知類型的對象調用方法。HelloWorld 類有一種 PrintHello 方法,可以打印出 "Hello World" 及傳遞給PrintHello 方法的一些文本。本例中PrintHello 方法 調用實際上是Type. InvokeMember ; Visual Basic 代碼 允許PrintHello 方法被調用,仿佛 對象的類型 (helloObj)在編譯時就已經(jīng)知道了(前期綁定),而不是在運行時(后綁定)。
[Visual Basic]
Imports System
Module Hello
Sub Main()
' Set up variable.
Dim helloObj As Object
' Create the object.
helloObj = new HelloWorld()
' Invoke the print method as if it was early bound
' even though it's really late bound.
helloObj.PrintHello("Visual Basic Late Bound")
End Sub
End Module

自定義綁定
Reflection除了可以隱性地被編譯器用于后綁定,也可以在代碼中顯示使用,來完成后綁定。

common language runtime 支持多種編程語言,這些語言的綁定規(guī)則互不相同。在前綁定的情況下,代碼生成器能完全控制綁定。然而,在使用Reflection的后綁定中,綁定必須由自定義綁定控制。Binder類提供成員選擇與調用的自定義控制。

使用自定義綁定, 您可以在運行時裝載assembly,獲得assembly中關于類型的信息,指明您索要的類型,并且調用方法,訪問字段,或類型的屬性。如果在編譯時您不知道對象的類型,該技術就顯得格外有用,比如,當對象類型依賴于用戶輸入時。以下例子中的代碼顯示了在HelloWorld.dll assembly 中,被動態(tài)使用Reflection調用的方法,第一個在Visual Basic.NET,第二個在C#中。
[Visual Basic]
' This class is deployed as an assembly consisting Hello World string.
Private m_helloWorld As String = "HelloWorld"
' Default public constructor.
Public Sub New()

End Sub 'New

' Print "Hello World" plus thepassed text.
Public Sub PrintHello(txt As String)
' Output to the Console.
Console.WriteLine((m_helloWorld & "" & txt))
End Sub
End Class

Imports System
Imports System.Reflection
Module VisualBasicLateHello
Sub Main()
' Set up the variables.
Dim assem as System.Reflection.Assembly
Dim obj as Object
Dim helloType as Type
Dim printMethod as MethodInfo
' Load the assembly to use.
assem = System.Reflection.Assembly.Load("HelloWorld")
' Get the type to use from the assembly.
helloType = assem.GetType("HelloWorld")
' Get the method to use from the type.
printMethod = helloType.GetMethod("PrintHello")
' Create an instance of the type.
obj = Activator.CreateInstance(helloType)
' Create an array to hold the arguments.
Dim args(1) as Object
' Set the arguments.
args(0) = "From Visual Basic Late Bound"
' Invoke the method.
printMethod.Invoke(obj, args)
End Sub
End Module


以下為C# 版:
[C#]
// This class is deployed as an assembly consisting of one DLL,
// called HelloWorld.dll.
using System;
public class HelloWorld {
// Constant Hello World string.
private const String m_helloWorld = "Hello World";
// Default public constructor.
public HelloWorld() {
}
// Print "Hello World" plus the passed text.
public void PrintHello(String txt) {
// Output to the Console.
Console.WriteLine(m_helloWorld + " " + txt);
}
}

// Illustrates reflection's late binding functionality.
// Calls the PrintHello method on a dynamically loaded
// and created instance of the HelloWorld class.
using System;
using System.Reflection;
public class CSharpLateHello {
public static void Main() {
// Load the assembly to use.
Assembly assem = Assembly.Load("HelloWorld");
// Get the type to use from the assembly.
Type helloType = assem.GetType("HelloWorld");
// Get the method to call from the type.
MethodInfo printMethod = helloType.GetMethod("PrintHello");
// Create an instance of the HelloWorld class.
Object obj = Activator.CreateInstance(helloType);
// Create the args array.
Object[] args = new Object[1];
// Set the arguments.
args[0] = "From CSharp Late Bound";
// Invoke the PrintHello method.
printMethod.Invoke(obj, args);
}
}


InvokeMember 與 CreateInstance
可以使用Type.InvokeMember來調用某類型成員。各種類的CreateInstance 方法,例如System.Activator 和 System.Reflection.Assembly,是InvokeMember的專用形式,用于生成某類型新的實例。Binder類在這些方法中,被用于重載解析和參數(shù)轉換。

以下例子中的代碼顯示了三種可能的參數(shù)轉換及成員選擇的組合。在Case1中, 不需要參數(shù)轉換或成員選擇。在Case 2中,只需要成員選擇。在Case3中, 只需要參數(shù)轉換。
[C#]
public class CustomBinderDriver
{
public static void Main (string[] arguments)
{
Type t = typeof (CustomBinderDriver);
CustomBinder binder = new CustomBinder();
BindingFlags flags = BindingFlags.InvokeMethod|BindingFlags.Instance|
BindingFlags.Public|BindingFlags.Static;

//Case 1. Neither argument coercion nor memberselection is needed.
args = new Object[] {};
t.InvokeMember ("PrintBob", flags,binder, null, args);

//Case 2. Only member selection is needed.
args = new Object[] {42};
t.InvokeMember ("PrintValue", flags,binder, null, args);

//Case 3. Only argument coercion is needed.
args = new Object[] {"5.5"};
t.InvokeMember ("PrintNumber",flags, binder, null, args);
}

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

public static void PrintValue (long value)
{
Console.WriteLine ("PrintValue ({0})",value);
}
public static void PrintValue (String value)
{
Console.WriteLine ("PrintValue\"{0}\")",value);
}

public static void PrintNumber (double value)
{
Console.WriteLine ("PrintNumber ({0})",value);
}
}


當存在多于一個的同名成員時,就需要有重載解析。Binder.BindToMethod 和Binder.BindToField 方法可以用來綁定到一個成員。Binder.BindToMethod也可以通過get 和set 屬性訪問器提供屬性解析。

BindToMethod 返回可被調用的MethodBase. 如無可用的調用則返回null. 如果無法調用,BindToMethod 返回 MethodBase 為 調用或 null。MethodBase返回值無需是match參數(shù)之一,盡管事實往往如此。

調用者 也許會想得到ByRef 參數(shù)的返回。所以,如果BindTo方法改動過參數(shù)數(shù)組,Binder 允許客戶使參數(shù)數(shù)組映射回它原來的表格。為了實現(xiàn)這點,調用者必須確保參數(shù)順序不變。當參數(shù)由名字傳遞,Binder重新整理參數(shù)組,以供調用者察看。

可用成員是指那些在類型或任何基本類型中定義的那些成員。如果指明BindingFlags.NonPublic,任何訪問級別的成員都會在返回中。如果BindingFlags.NonPublic 沒有被指明,binder必須執(zhí)行訪問規(guī)則。當指明Public或 NonPublic 綁定標志, 你必須也指明Instance 或Static 標志, 否則不會有成員返回。

如果只有一個成員與名字對應,就不需要回調,也就完成到這個方法的綁定。Case 1 中的代碼例子表明了這一點:只有一個可用的PrintBob 方法, 所以,不需要回調。

如在可用集中,有多于一個成員。所有這些方法被傳遞給BindTo方法, 再由它選擇適當?shù)姆椒ǎ⑶曳祷。?Case 2 中的代碼例子中,有兩種叫做PrintValue的方法。合適的方法取決于對BindToMethod調用。

ChangeType 執(zhí)行參數(shù)轉換, 它把實際參數(shù)轉變?yōu)檫x定方法的參數(shù)類型。即使類型已經(jīng)完美匹配,ChangeType也會針對每個參數(shù)被調用。

在 Case 3 中的代碼例子中, 值為"5.5"的String類型的一個實際參數(shù)以正式參數(shù)Double類型被傳遞給方法。要想調用成功,字符串值"5.5"必須被轉變?yōu)橐粋double值。ChangeType 執(zhí)行了這種轉變。

ChangeType 僅執(zhí)行無損失轉換, 如下表所示:
Source Type Target Type
Any type Its base type
Any type Interface it implements
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
Non-reference type Reference type

Type類有Get方法,可使用Binder類型的參數(shù)的來解析對某成員的引用。Type.GetConstructor,Type. GetMethod , 和 Type.GetProperty 通過提供某成員的簽名信息來查找該成員。它們調用Binder.SelectMethod和Binder.SelectProperty 以選擇適合方法的簽名信息。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 人妻熟妇乱又伦精品视频| 欧美特级aaa| 免费观看国产视频在线| 91免费版看片| 成人免费毛片在线观看| 91精品国产91久久久久麻豆 主演| 亚洲va在线va天堂va偷拍| 亚洲国产一二三精品无码| 天天插天天操天天射| 好吊色视频988gao在线观看| 中文字幕66页| 黄色一级片在线看| 国产视频一视频二| 三区视频在线观看| 天天久久综合网| 成年人视频在线免费| 免费看av软件| 欧美xxxxx在线视频| 农村妇女精品一二区| 波多野结衣作品集| 精品无码一区二区三区在线| 91国内在线播放| 青青草原播放器| 国产成人a亚洲精v品无码| 久久久久狠狠高潮亚洲精品| 福利视频一二区| 91视频最新入口| 国产特级淫片高清视频| 久久久久久久激情| 亚洲色图38p| 女人和拘做爰正片视频| 欧美一级视频免费看| 国产精品欧美激情在线观看| 国产成人精品无码播放| 天天操天天爱天天爽| 天天干天天综合| 欧美一级xxxx| 菠萝蜜视频在线观看入口| 中文字幕在线乱| 黄色免费观看视频网站| 国产福利视频在线播放| 三级a在线观看| 国产又黄又爽免费视频| 国产精品久久久久久久久电影网| www成人免费| 成人黄色av片| 天天视频天天爽| 在线观看成人免费| 国产成人黄色片| 国产探花在线观看视频| 男人添女人荫蒂免费视频| www.超碰com| 精产国品一二三区| 噜噜噜久久亚洲精品国产品麻豆| 亚洲少妇第一页| 米仓穗香在线观看| 茄子视频成人免费观看| 婷婷激情小说网| 六月婷婷在线视频| 天天操夜夜操很很操| 欧美一区二区三区爽大粗免费| 九色porny自拍| 日本网站免费在线观看| 亚洲精品在线网址| 亚洲成人福利在线观看| a级片一区二区| 欧美视频亚洲图片| 久久婷婷五月综合色国产香蕉| 丁香色欲久久久久久综合网| 天堂网在线免费观看| 国产精品专区在线| 国产精品三级一区二区| 中文字幕一区二区在线观看视频 | av之家在线观看| 国产精品少妇在线视频| 青青草国产免费| 丝袜人妻一区二区三区| 欧洲美女和动交zoz0z| 日本中文字幕观看| 亚洲狼人综合干| 免费在线激情视频| 国产一区二区网| 久久久性生活视频| 久久久久99精品成人片| 欧美一级爱爱视频| 国产精品无码电影在线观看| 日本美女高潮视频| 在线观看亚洲色图| 亚洲综合日韩欧美| 久久人人爽av| 亚洲欧洲日本精品| 亚洲色图 在线视频| 天天操天天爱天天爽| 成人午夜激情av| 不用播放器的免费av| 欧美日韩在线不卡视频| www.com毛片| 精品丰满人妻无套内射| 欧美一级欧美一级| 国产裸体舞一区二区三区| 999在线免费视频| 国产精品探花在线播放| 三年中文高清在线观看第6集| 国产av不卡一区二区| 欧美激情亚洲天堂| 国产69精品久久久久999小说| 国产青青在线视频| 手机看片福利盒子久久| 亚洲少妇久久久| 50度灰在线观看| 成人在线免费在线观看| 一个色综合久久| 免费视频爱爱太爽了| 那种视频在线观看| 欧美又黄又嫩大片a级| 成人黄色大片网站| 亚洲综合av在线播放| 99视频在线视频| 免费看日本黄色| 日本美女视频一区| 男女高潮又爽又黄又无遮挡| 午夜国产福利在线观看| 男人用嘴添女人下身免费视频| 在线视频日韩一区| 欧美成人精品免费| 九色porny自拍| 国产极品尤物在线| av在线网站免费观看| 成人一对一视频| 一二三四中文字幕| 男生操女生视频在线观看| www.玖玖玖| 免费一级特黄毛片| 奇米777在线| 一起操在线视频| 丰满少妇被猛烈进入高清播放| 亚洲欧美日韩三级| 欧美日韩成人免费视频| 9久久婷婷国产综合精品性色 | 99在线免费视频观看| 国产在线观看中文字幕| 欧美成人黄色网址| 久久久999免费视频| 夜夜添无码一区二区三区| 亚洲色图都市激情| 97人人模人人爽人人澡| 男人女人黄一级| 国产九九在线观看| 福利在线一区二区三区| 成年人视频在线免费| 国产主播在线看| 春日野结衣av| 亚洲熟女乱色一区二区三区| 香蕉视频xxx| 日韩av福利在线观看| 亚洲涩涩在线观看| 欧美日韩视频免费在线观看| 亚洲欧美视频二区| 在线成人免费av| 50度灰在线观看| 国产真人做爰毛片视频直播| 欧美 丝袜 自拍 制服 另类| 霍思燕三级露全乳照| 激情六月丁香婷婷| 日本xxxx黄色| 日韩av加勒比| 免费高清一区二区三区| 欧美精品自拍视频| 另类小说色综合| 无码人妻精品一区二区三区99v| 男同互操gay射视频在线看| 草草草视频在线观看| 国自产拍偷拍精品啪啪一区二区| 成熟丰满熟妇高潮xxxxx视频| 日韩手机在线观看视频| 手机av在线免费| 欧美视频在线第一页| 久久无码高潮喷水| 亚洲理论中文字幕| 亚洲理论电影在线观看| 成人黄色一区二区| 97超碰成人在线| 久久美女福利视频| 国产资源中文字幕| 无码人妻丰满熟妇区毛片18| 在线播放免费视频| 国产黄视频在线| 亚洲国产欧美91| 狠狠操精品视频| 黄色一级大片免费| 啊啊啊一区二区| 日本在线xxx| 国产av不卡一区二区| 88av.com| 国产一区二区网| 色哟哟免费网站| 日韩 国产 一区| 制服丝袜中文字幕第一页| 国产91美女视频| 国产999免费视频|