1. 程式人生 > >C# 反射泛型

C# 反射泛型



C#泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上
 
先看一個簡單的例子。
 
class Class1<T>
{
  public void Test(T t)
  {
    Console.WriteLine(t);
  }
}
 
要利用反射動態建立該型別例項,並呼叫 Test 方法,我們可以使用如下方法
 
Type type = typeof(Class1<int>);
object o = Activator.CreateInstance(type);
type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { 123 });
 
但如果泛型引數是未定的,我們該如何處理呢?其實 Type 已經增加了類似的處理機制。
 
static void InvokeTest(Type t, params object[] args)
{
  Type type = typeof(Class1<>);
  type = type.MakeGenericType(t);
  object o = Activator.CreateInstance(type);
  type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
}
 
另外一種情況就是泛型方法,
class Class1
{
  public void Test<T>(T t)
  {
    Console.WriteLine(t);
  }
}
 
方法類似,只不過這回使用的是 MethodInfo.MakeGenericMethod()
 
static void InvokeTest(Type t, params object[] args)
{
  Type type = typeof(Class1);
  object o = Activator.CreateInstance(type);
  MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);
 
  method = method.MakeGenericMethod(t);
  method.Invoke(o, args);
}

當然還有例項化一個泛型

例如有GenericType<M,N>

Type genericType = typeof(GenericType<>);

Type[] templateTypeSet = new[] { typeof(string), typeof(int) };

Type implementType = genericType.MakeGenericType( templateTypeSet );

這樣 implementType型別就是賦予了string,int的泛型類了

相關推薦

C# 反射

 C#泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上   先看一個簡單的例子。   class Class1<T> {   public void Test(T t)   {     Console.WriteLine(t);   }

C# 利用反射靈活接收資料

private void button1_Click(object sender, EventArgs e) { //dic是獲取到的資料列表,這裡假設成有這三種 Dictionary<string, object> dic = new Dictionary

C# List 反射, 函式的反射

  var typeList = typeof(List<>);                     Type typeDataList = typeList.MakeGenericType(datatypeTarget.DataObjectType);  

C#面試題(二)(包含答案) ------ GC/反射

1.GC 機制          垃圾收集,Garbage Collector(垃圾收集器,在不至於混淆的情況下也成為GC)以應用程式的root為基礎,遍歷應用程式在Heap上動態分配的所有物件,通過識別它們是否被引用來確定哪些物件是已經死亡的、哪些仍需要被使用。已經不再被應

C#入門集合List<T>

div nbsp 需要 強制轉換 初始 cnblogs lsi 轉換 blog 泛型集合 List<T> List<T>泛型集合特點: <T>表示泛型,T是Type簡寫,表示當前不確定具體類型; 可以根據用戶的實際需要,確定當前集合需要

[]C# 之詳解

如果 runtime 表現 log 都是 元數據 訪問 全面 compare 什麽是泛型 我們在編寫程序時,經常遇到兩個模塊的功能非常相似,只是一個是處理int數據,另一個是處理string數據,或者其他自定義的數據類型,但我們沒有辦法,只能分別寫

c#之詳解

ring 獲取 更改 9.png 主題 efault 出現 方案 泛型接口 這篇文章主要來講講c#中的泛型,因為泛型在c#中有很重要的位置,對於寫出高可讀性,高性能的代碼有著關鍵的作用。 一、什麽是泛型? 泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個

C 語言編程--quickSort實現

ring log enum endif ide swa none ret sta 1 #ifndef _GENERICQUICKSORT_H_ 2 #define _GENERICQUICKSORT_H_ 3 void generic_swap(void * pa, v

CLR via C#關於(Generics )的摘錄

類庫 prope png param [] ron using 排序算法 相互 泛型,是CLR和編程語言提供的一種特殊機制,它支持另一種形式的代碼重用,即“算法重用”。 簡單的說,開發人員先定義好一個算法,比如排序、搜索、交換、比較或者轉換等。但是

關於C#中參數約束(where T : class)

name ica title logic .get ted inter host ase .NET支持的類型參數約束有以下五種:where T : struct | T必須是一個結構類型where T :

C/C++基礎----算法

for_each 有一個 cti 如果 oid 叠代 lambda 字符串 由於 算法不依賴與容器(使用叠代器),但大多數依賴於元素類型。如find需要==運算符,其他算法可能要求支持<運算符。 算法永遠不會執行容器的操作,永遠不會改變底層容器的大小(添加或刪除元

C# 理解

術語表 generics:泛型 type-safe:型別安全 collection: 集合 compiler:編譯器 run time:程式執行時 object: 物件 .NET library:.Net類庫 value type: 值型別 box: 裝箱 unbox: 拆箱 implicity

JAVA常用基礎知識點[繼承,抽象,介面,靜態,列舉,反射,,多執行緒...]

類的繼承Java只支援單繼承,不允許多重繼承- 一個子類只能有一個父類- 一個父類可以派生出多個子類這裡寫圖片描述子類繼承了父類,就繼承了父類的方法和屬性。在子類中,可以使用父類中定義的方法和屬性,也可以建立新的資料和方法。因而,子類通常比父類的功能更多。在Java 中,繼承的關鍵字用的是“extends”,

C#普通介面、協變介面、逆變介面例項

本文部分說明來自書籍和網摘。介面成員例項化之後該介面成員的“返回值型別”和“引數型別”不能改變的介面變數,稱之為不變數。協變和逆變正是建立在“不變”的基礎之上的。 協變保護( 協變數的型別相容是從小到大的“拓展性”相容。)介面成員“輸出”的相容性(允許隱式轉換)。 逆變則逆轉( 逆變數的

C++: 演算法

泛型演算法   泛型演算法大多數獨立於任何特定的容器,這些演算法是獨立的(或者稱“泛型的”),他們可以用於不同型別的容器和不同型別的元素。泛型演算法本身不會執行容器的操作,他們只會執行在迭代器之上,執行迭代器的操作。       泛型演算法基本包含在&

C#:

按照我的理解,泛型指的是“加強的型別”。舉例來說,我們使用傳統的基礎資料型別,int,float,double這樣的變數,需要先宣告再賦值然後才能引用,但是如果聲明瞭沒賦值就開始引用呢?那麼就會報錯。但是有時候,對於一些程式中的某些變數而言,空(null)是被允許而且在有些情況下是有意義的,那這時候

c# 之

        什麼是泛型:泛型就是通過引數化型別來實現在同一份程式碼上操作多種資料型別,利用“引數化型別”將型別抽象化,從而實現靈活的複用。        使用泛型給程式碼帶來的5點好處:1、可以最大限度的重用程式碼、保護型別

Java進階學習第十四天(反射、註解、Log4J日誌元件)

一、泛型 1、概述 泛型是JDK1.5以後才有的,可以在編譯時期進行型別檢查,且可以避免頻繁型別轉化! // 執行時期異常 @Test public void testGeneric() throws Exception { // 集合的宣告 List list

Unity之C#——利用與委託拓展氣泡排序

       利用泛型與委託拓展氣泡排序        氣泡排序一般只適用於一些可直接比較大小的單個值,如果遇到比較物件陣列中某一個屬性,對物件陣列中的元素進行排序,就顯得不適用了,例如有一組學生物件,將他們存入

C#mysqlDao.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySql.Data.MySqlClient; namespace ConsoleApplicatio