日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
詳解LINQtoReflection反射機(jī)制

引言

成都創(chuàng)新互聯(lián)專注于咸陽(yáng)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),電子商務(wù)商城網(wǎng)站建設(shè)。咸陽(yáng)網(wǎng)站建設(shè)公司,為咸陽(yáng)等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

我們平時(shí)開(kāi)發(fā)中不可避免,或者說(shuō),經(jīng)常性的使用反射。但是卻沒(méi)有一個(gè)合適的類庫(kù)幫助我們更好的利用反射。從早期的FastInvoker,到老趙的 fastreflectionlib ,無(wú)一不是在強(qiáng)調(diào)Fast。這是因?yàn)榉瓷涞男阅軗p耗比較厲害,所以大家都集中精力解決性能的問(wèn)題,但是在易用性方面卻鮮有改進(jìn)。今天我為大家?guī)?lái)一個(gè)即兼顧性能又具有良好的使用體驗(yàn)的反射類庫(kù).

.Metadata()

此類庫(kù)以LINQ TO Object為基礎(chǔ),可以通過(guò)調(diào)用.Metadata()方法獲取對(duì)應(yīng)Type的完整Metadata信息。此信息會(huì)被進(jìn)行緩存,并且使用fastreflectionlib的核心Lambda代碼,利用DynamicMethod代替直接的反射執(zhí)行。

 
 
 
  1. public static Metadata Metadata(this object instance)         
  2.  {             
  3.  return MetadataCache.Create(instance);      
  4.     }      

先定義一個(gè)MockObject

 
 
 
  1. class MockAttribute : Attribute        
  2.   {              
  3. public MockAttribute(string name)            {                 
  4.  this.Name = name;         
  5.      }          
  6.     public string Name        
  7.       {                get;set;          
  8.     }        }       
  9.    class MockObject       
  10.    {          
  11.     public string Country = "China";                   
  12.        [Mock("this is the name")]      
  13.         public string Name      
  14.         {                get;set;            }         
  15.      public string Blog        
  16.       {                get;set;     
  17.          }            
  18.   [Mock("this is the location")]        
  19.       public string Location     
  20.          {                get;set;            }            
  21.   public string SayHello(string name)            {              
  22.     return "Hi," + name;        
  23.       }        }    } 

1.如何獲取一個(gè)屬性,并進(jìn)行取值、賦值?

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void set_property_value()         
  4.  {              
  5. var obj = new MockObject { Name = "dayi", Blog = "http://walkingboy.cnblogs.com", Location = "XiaMen" };              
  6. var property = obj.Metadata().Properties.Where(i => i.Name == "Location").FirstOrDefault();             
  7.  var changedLocation = "Xiamen,China";             
  8.  //get value  
  9.  //var value = property.GetValue(obj);  
  10. property.SetValue(obj, changedLocation);  
  11. Assert.AreEqual(changedLocation, obj.Location);  
  12.         }    

2.如果獲取一個(gè)字段的值?

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void get_field_value()         
  4.  {              
  5. var obj = new MockObject();              
  6. var field = obj.Metadata().Fields.Where(i => i.Name == "Country").FirstOrDefault();  
  7. Assert.AreEqual("China", field.GetValue(obj));         
  8.  }    

3.如何獲取一個(gè)自定義CustomAttribute?

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void get_custom_attribute_data()        {              
  4. var obj = new MockObject { Name = "dayi", Blog = "http://walkingboy.cnblogs.com", Location = "XiaMen" };             
  5.  var attribute = obj.Metadata().Properties                 
  6.  .Where(i => i.Name == "Name")                 
  7.  .SelectMany(i => i.Attributes)                 
  8.  .Select(i=>i.Attribute)                  
  9. .OfType()                  
  10. .FirstOrDefault();              
  11. Assert.AreEqual("this is the name", attribute.Name);        
  12.   }   

4.如何調(diào)用一個(gè)指定名稱的Method?

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void invoke_method()       
  4.    {              
  5. var obj = new MockObject();              
  6. var method = obj.Metadata().Methods.Where(i => i.Name == "SayHello").FirstOrDefault();  
  7. Assert.AreEqual("Hi,world",method.Invoke(obj,new []{"world"}));       
  8.    }.Proxy() 

對(duì)于某些應(yīng)用場(chǎng)景來(lái)說(shuō),使用LINQ To Object去查詢并獲取單一的方法、屬性,字段,總覺(jué)得還是要寫非常多的代碼。要先.Metadata(), 接下來(lái).Where(), 雖然代碼很優(yōu)雅,但是還是有很多工作要做。所以這里也提供一個(gè)針對(duì)獲取單一方法、屬性、字段的替代寫法。

 
 
 
  1. public static Proxy Proxy(this object instance)  
  2.         {  
  3.             return new Proxy(instance);  
  4.         } 

1.如何獲取一個(gè)屬性的值

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void get_value_via_property_proxy()        {             
  4.  var obj = new MockObject { Name = "dayi", Blog = "http://walkingboy.cnblogs.com", Location = "Xiamen" };             
  5.  Assert.AreEqual(obj.Name, obj.Proxy().Properties["Name"]);   
  6.        } 

2.如何設(shè)置一個(gè)屬性的值

 
 
 
  1. using Sparrow.Reflection;     
  2.      [TestMethod]       
  3.    public void set_value_via_property_proxy()        {            
  4.   var obj = new MockObject 
  5. { Name = "dayi", Blog = "http://walkingboy.cnblogs.com", Location = "Xiamen" };           
  6.    var changedLocation = "Xiamen,China";      
  7.       obj.Proxy().Properties["Location"] = changedLocation;       
  8.        Assert.AreEqual(changedLocation,obj.Location);      
  9.     }  

3.如何獲取一個(gè)字段的值

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void get_value_via_field_proxy()        {             
  4.  var obj = new MockObject 
  5. { Name = "dayi", Blog = "http://walkingboy.cnblogs.com", Location = "Xiamen" };              
  6. Assert.AreEqual(obj.Country, obj.Proxy().Fields["Country"]);      
  7.     } 

4.如何調(diào)用一個(gè)方法

 
 
 
  1. using Sparrow.Reflection;          
  2. [TestMethod]          
  3. public void invoke_method_via_method_proxy()        {              
  4. var obj = new MockObject();            
  5. Assert.AreEqual("Hi,world", obj.Proxy().Methods["SayHello"](new []{"world"}));       
  6.    }.Proxy() Vs Dynamic 

我們知道在C# 4中引入了關(guān)鍵字Dynamic,使得 Duck Typing (DynamicDuck: Duck Typing in a Dynamic World)

成為一種可能。 查看如下代碼

 
 
 
  1. public void Run(dynamic obj)       
  2.    {              Console.WriteLine(obj.Name);  
  3.         }  

這個(gè)代碼并沒(méi)有指定參數(shù)obj的類型,obj的類型是由運(yùn)行時(shí)候傳入的真實(shí)值決定,只要該類型包含一個(gè)Name的屬性就可以了。

但是僅僅支持Duck Typing就夠了嘛? 似乎不夠動(dòng)態(tài)哦。這邊的.Name 是在編譯時(shí)(或者說(shuō)編碼時(shí))就確定,但是往往我們的使用場(chǎng)景中,連這個(gè)也都是動(dòng)態(tài),比如是接受自Form,或者來(lái)自配置信息,這個(gè)時(shí)候dynamic就無(wú)能為力了。

反過(guò)來(lái)看看使用.Proxy()的情況

 
 
 
  1. public void Run(object obj,string propertyName)       {           
  2.    Console.WriteLine(obj.Proxy().Properties[propertyName])     
  3.     } 

標(biāo)題名稱:詳解LINQtoReflection反射機(jī)制
本文URL:http://www.dlmjj.cn/article/dheogjs.html