成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解LINQ to Reflection反射機制

開發 后端
本文將討論的是LINQ的反射機制。需要解決的是反射性能損耗問題,其次就是易用性方面的改進,希望對大家有所幫助。

引言

我們平時開發中不可避免,或者說,經常性的使用反射。但是卻沒有一個合適的類庫幫助我們更好的利用反射。從早期的FastInvoker,到老趙的 fastreflectionlib ,無一不是在強調Fast。這是因為反射的性能損耗比較厲害,所以大家都集中精力解決性能的問題,但是在易用性方面卻鮮有改進。今天我為大家帶來一個即兼顧性能又具有良好的使用體驗的反射類庫.

.Metadata()

此類庫以LINQ TO Object為基礎,可以通過調用.Metadata()方法獲取對應Type的完整Metadata信息。此信息會被進行緩存,并且使用fastreflectionlib的核心Lambda代碼,利用DynamicMethod代替直接的反射執行。

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

先定義一個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.如何獲取一個屬性,并進行取值、賦值?

  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.如果獲取一個字段的值?

  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.如何獲取一個自定義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<MockAttribute>()                  
  10. .FirstOrDefault();              
  11. Assert.AreEqual("this is the name", attribute.Name);        
  12.   }   

4.如何調用一個指定名稱的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() 

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

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

1.如何獲取一個屬性的值

  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.如何設置一個屬性的值

  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.如何獲取一個字段的值

  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.如何調用一個方法

  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中引入了關鍵字Dynamic,使得 Duck Typing (DynamicDuck: Duck Typing in a Dynamic World)

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

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

這個代碼并沒有指定參數obj的類型,obj的類型是由運行時候傳入的真實值決定,只要該類型包含一個Name的屬性就可以了。

但是僅僅支持Duck Typing就夠了嘛? 似乎不夠動態哦。這邊的.Name 是在編譯時(或者說編碼時)就確定,但是往往我們的使用場景中,連這個也都是動態,比如是接受自Form,或者來自配置信息,這個時候dynamic就無能為力了。

反過來看看使用.Proxy()的情況

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

原文標題:LINQ TO Reflection

鏈接:http://www.cnblogs.com/walkingboy/archive/2010/08/11/linq-to-reflection.html

【編輯推薦】

  1. Linq匿名類型簡單概述
  2. Linq隨機讀取數據淺析
  3. Linq Lambda表達式全面分析
  4. Linq擴展方法簡單分析
  5. 初探Linq局部變量類型
責任編輯:彭凡 來源: 博客園
相關推薦

2009-06-17 13:57:54

java實例Reflection

2024-09-18 00:00:02

反射C#元數據

2011-03-09 09:11:52

java反射機制

2011-09-27 10:23:24

Java反射機制

2011-05-26 15:23:34

JavaReflection

2011-04-01 14:50:56

Java的反射機制

2009-09-16 09:47:15

Linq Tracki

2010-02-04 11:23:25

C++反射機制

2009-09-18 14:51:19

LINQ TO SQL

2009-09-08 17:27:18

LINQ to Dat

2009-04-10 09:55:44

C#反射.NET

2012-04-05 13:50:38

Java

2009-09-14 16:17:03

什么是LINQ To

2009-09-09 10:54:52

Linq存儲過程返回

2017-03-24 09:44:33

Java反射機制

2017-05-17 15:28:15

Java反射機制

2009-09-14 13:17:51

LINQ to SQLLINQ to SQL

2009-09-14 14:49:12

LINQ查詢基礎知識

2024-09-11 08:00:00

Java優于反射開發

2009-09-03 11:00:29

C#反射機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人在线一区 | 亚洲一二三区在线观看 | 男女羞羞视频免费 | 欧美一级片黄色 | 午夜精品久久久久久久久久久久 | 国产一区二区小视频 | 中文二区| 欧美精品成人一区二区三区四区 | 久久久久久久久久久久久久av | 美女天天干天天操 | 国产精品久久久久久久久久免费看 | 亚洲 中文 欧美 日韩 在线观看 | 精品久久影院 | av三级| 狠狠躁天天躁夜夜躁婷婷老牛影视 | 91在线成人| 久视频在线 | 在线视频国产一区 | 国产精品a久久久久 | 国产成人精品免高潮在线观看 | 范冰冰一级做a爰片久久毛片 | 国产亚洲欧美在线视频 | 中文字幕在线观看一区 | 久久99精品国产 | 欧美成年黄网站色视频 | 中文字幕日韩三级 | 免费国产视频在线观看 | 日日操夜夜干 | 亚洲日韩中文字幕一区 | 亚洲精品亚洲人成人网 | 狠狠伊人 | 91久久国产 | 欧美黄色网 | 911网站大全在线观看 | 成年人视频在线免费观看 | 国产免费福利小视频 | 999视频 | 欧美日韩中| 亚洲综合一区二区三区 | 亚洲精品久久久 | 久久精品亚洲 |