日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C# > 正文

C#泛型方法在lua中表示的一種設計詳解

2019-10-29 19:32:15
字體:
來源:轉載
供稿:網友

前言

在進行lua方法注冊的時候, 大多數解決方案直接否定了泛型方法, 因為在lua側難以表達出泛型, 以及lua的函數重載問題,

函數重載問題可以通過一些特殊方法解決, 而泛型問題是主要問題, 以Unity + Slua的情況來說

比如下面的類:

public class Foo  {   public static void GetTypeName(System.Type type)   {    Debug.Log(type.Name);   }   public static void GetTypeName<T>()   {    Debug.Log(typeof(T).Name);   }  }

一般只會生成  GetTypeName(System.Type type) 的注冊方法.

那么泛型的方法在Lua那邊該怎樣注冊才能讓這個調用能夠實現呢? 一般來說我們調用泛型方法必須在寫代碼的時候就確定, 像這樣:

Foo.GetTypeName<int>();  // 輸出 Int32

而lua并不能這樣約束, 它的調用必須還是非泛型的才可以, 這是第一個問題, 而第二個問題是lua那邊怎樣寫? 我們希望它的寫法能跟C#保持

一致, 或者相似吧, 讓人看起來容易明白, 可是lua中中括號是大于小于號, 不能這樣寫, 想想有沒有什么辦法

因為在lua中是沒有類型的, 類型必須來自C#, 所以只能將泛型作為非泛型方法才能使用, 如果讓函數進行一次退化和封裝, 像下面這樣

-- 先將C# 的typeof注冊成全局函數, 注冊System.Int32命名為intlocal Foo = {}Foo.GetTypeName = function(type) return function()   print(type.Name) endend
Foo.GetTypeName(typeof(int))();  -- luaFoo.GetTypeName<typeof(int)>();  // C#

這樣寫的話, 除了尖括號, 基本就能兩邊一致了對吧, 運行結果也是一樣的

/*至于怎樣注冊typeof(int)*/// 在LuaState的Init中注冊個全局函數[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]internal static int getType(IntPtr L){  System.Type type = null;  LuaObject.checkType(L, 1, out type);  LuaObject.pushObject(L, type);  return 1;}// 在LuaState的Init中自己注冊咯LuaDLL.lua_pushcfunction(L, getType);LuaDLL.lua_setglobal(L, "typeof");
// CustomExport.OnAddCustomClass 中添加類型別名add(typeof(System.Int32), "int"); // int

 只是這里lua的函數沒有進行C#那邊的調用啊, 下一步就來看看有沒有什么辦法來實現調用.

如果通過自動注冊的話, Foo應該是一個已經注冊的類型.

[SLua.CustomLuaClass]public class Foo

并且有元表, 元表里面有非泛型的GetTypeName方法了. 現在先不要去動元表,

直接注冊這個到Table里面, 因為如果Table里面有值的話, 就不會去查詢元表了

import "Foo";Foo.GetTypeName(typeof(int));  // 輸出 Int32rawset(Foo, "GetTypeName", function(type) return function()  local mt = getmetatable(Foo)  local func = rawget(mt,"GetTypeName");  func(type) endend)Foo.GetTypeName(typeof(int))();  // 輸出 Int32 -- 注意返回了function然后再次調用

 這個方法比較流氓, 因為直接默認了有非泛型函數, 并且覆蓋了元表的非泛型方法, 不可取的.

要繼續的話, 首先來看看一個泛型方法怎樣通過Type方法進行調用的:

var methods = typeof(Foo).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod);  foreach(var method in methods)  {   if(method.IsGenericMethod)   {    var paramters = method.GetParameters();    if(paramters == null || paramters.Length == 0)    {     var genericMethod = method.MakeGenericMethod(new Type[] { typeof(int) });     if(genericMethod != null)     {      genericMethod.Invoke(null, null);  // 輸出 Int32              break;     }    }   }  }

當然是反射啦, 這樣就能讓泛型方法退化為非泛型了, 雖然是一個緩慢的反射, 不過時間基本只花費在Invoke上, 問題還不大.

剩下的問題是重載了, 有非泛型和泛型的兩個同名函數, 為了測試我先刪除掉非泛型,

[SLua.CustomLuaClass]public class Foo{ //public static void GetTypeName(System.Type type) //{ // Debug.Log(type.Name); //} public static void GetTypeName<T>() {  Debug.Log(typeof(T).Name); }}

生成的lua注冊代碼也要修改一下

   System.Type a1;   checkType(l,1,out a1);   Foo.GetTypeName(a1);  // 它完了   pushValue(l,true);

改成

System.Type a1;   checkType(l,1,out a1);   var methods = typeof(Foo).GetMethods(System.Reflection. BindingFlags.Public     | System.Reflection.BindingFlags.Static     | System.Reflection.BindingFlags.InvokeMethod);   foreach(var method in methods)   {    if(method.IsGenericMethod)    {     var paramters = method.GetParameters();     if(paramters == null || paramters.Length == 0)     {      var genericMethod = method.MakeGenericMethod(new Type[] { typeof(int) });      if(genericMethod != null)      {       genericMethod.Invoke(null, null);       break;      }     }    }   }   pushValue(l,true);

試試運行一下看看, 輸出 Int32 看來沒有問題, 問題是在Lua那邊還是需要手動封裝了一遍:

rawset(Foo, "GetTypeName", function(type) local mt = getmetatable(Foo) local func = rawget(mt,"GetTypeName"); func(type)end)-- 問題是, 不進行一次rawset無法得到泛型寫法Foo.GetTypeName(typeof(int));  // 輸出 Int32 -- Table方法

 到這里, 基本就可以得出結論了,

一. 在lua中可以通過封裝(閉包)的方式接近C#的泛型的寫法, 差別只是一個中括號和小括號

Foo.GetTypeName(typeof(int))();  -- luaFoo.GetTypeName<typeof(int)>();  // C#

然而過程異常復雜, 比如上述代碼中的rawset過程需要在C#的注冊代碼中進行實現, 而在調用的地方需要通過反射, 并且在lua側需要解決函數重載的問題,

上面的例子直接做了覆蓋. 就無法正常訪問非泛型方法函數了.

二. 既然泛型方法可以退化為非泛型, 那么可以直接檢測有沒有同名的且同參數的非泛型函數, 如果沒有就把泛型方法的非泛型版添加到注冊函數中即可.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
精品免费视频| 国产视频1区2区| 欧美在线日韩| 亚洲视频中文字幕| 日韩网站中文字幕| 99色在线视频| 99色在线视频| 91精品久久久久久久久久| 欧美一级二级三级区| 在线观看国产一级片| 欧美变态tickling挠脚心| 麻豆一区二区99久久久久| 日韩三级视频在线播放| 欧美1234区| 欧美日韩精品在线| 中文字幕亚洲第一| 亚洲中文字幕一区| 色综合久久六月婷婷中文字幕| 中文字幕五月欧美| 日韩欧美一二三四区| 欧美日韩国产黄色| 亚洲高清视频一区| 日韩欧美在线第一页| 欧美日韩精品在线视频| 精品三区视频| 最近免费中文字幕在线第一页| 日韩精品第一区| 亚洲女人天堂a在线播放| 精品亚洲综合| 久久蜜桃一区二区| 国产日韩中文在线| 久久精品久久精品亚洲人| 日韩三级视频在线播放| 国产日韩精品在线看| 国产高潮久久久| 久久福利视频一区二区| 91精品国产经典在线观看| 一区视频在线播放| 日韩欧美在线视频日韩欧美在线视频 | 91精品国产91久久久久久不卡| 国产欧美日韩不卡免费| 欧美日韩精品中文字幕| 国产一级片在线| 精品日韩视频在线观看| 欧美久久久精品| 欧美日韩高清一区二区不卡| 欧美日韩性视频一区二区三区| 欧美日韩午夜在线视频| 91精品国产色综合久久久蜜香臀 | 午夜伦欧美伦电影理论片| 91久久精品国产| 日韩欧美三级视频| 欧美日韩在线观看成人| 91精品国产综合久久蜜臀| 中文字幕欧美日韩在线不卡| 91精品久久久久| 精品一二三四| 日韩中文首页| 一级一片免费视频| 日韩欧美成人一区二区三区| aaa免费看大片| 蜜桃久久久久| 国产欧美日韩三级| 欧美中文字幕视频| 国产伦精品免费视频| 欧美日韩亚洲天堂| 国产一二三四| 中文字幕欧美日韩在线不卡| 日韩av一区二区在线观看| 精品在线观看一区| 1区2区在线| 91精品国产综合久久香蕉最新版| 国产精品福利视频一区二区三区| 国产欧美久久久久久久久| 日韩在线视频在线观看| 一区二区精品免费| 亚洲黄色在线观看| 一区二区在线看| 黄色欧美日韩| 国产1卡2卡三卡四卡网站| 国产wwww| 欧美日韩精品在线视频| 国产一级视频| 中文字幕视频一区二区三区久| 欧美国产三级| 亚洲免费视频一区| 亚洲大片精品永久免费| 国产欧美三级| 亚洲 欧美 精品| 一区二区三区免费看视频| 精品国产欧美日韩不卡在线观看| 日韩高清不卡| 免费视频久久| 91蜜桃婷婷狠狠久久综合9色| 国产福利一区在线观看| 中文字幕精品www乱入免费视频| av影视在线看| 精品国产免费观看一区| 91麻豆精品国产91久久久使用方法| 综合激情一区| 亚洲一区在线观看视频| 欧美日韩性视频在线| 成人h视频在线观看| 亚洲福利精品在线| 国产不卡在线观看视频| 欧美婷婷精品激情| 91精品在线观看入口| 国产v日产∨综合v精品视频| 视频一区三区| 欧美日韩国产一区中文午夜| 不卡在线视频| 中文字幕亚洲一区二区av在线| 国产导航在线| 欧美日韩中文字幕日韩欧美| 欧美成人二区| 91精品国产91久久久| 国产wwww| 国产性一级片| 亚洲视频 中文字幕| 日韩精品视频网站| 日韩在线中文字幕| 久久99久久久久| 日韩av二区| 91xxx在线观看| 日韩高清在线一区二区| 69堂精品视频在线播放| 日韩国产专区| 高清日韩中文字幕| 日韩欧美综合在线| 精品视频999| 高清在线一区| 精品视频999| 亚洲va韩国va欧美va精品| 国产在线看一区| 精品乱人伦一区二区三区| 欧美片网站免费| 久久久综合精品| 黄色国产网站在线观看| 日韩中文字幕| 中文在线а√在线8| 国产一级视频在线播放| 日韩中文字幕视频网| 国产一区在线观看视频| 欧美日韩精品久久久| aaa欧美日韩| 一区二区中文视频| 激情五月综合| 精品网站999www| 国产欧美日韩不卡| 国产欧美日韩最新| 中文字幕日韩在线观看| 伊人伊成久久人综合网小说| 国产久卡久卡久卡久卡视频精品| 国产婷婷一区二区| 日韩欧美国产午夜精品| 国产黄色片大全| 中文网丁香综合网| 激情五月综合| 91www成人久久| 午夜成人鲁丝片午夜精品| 久精品在线观看| 欧美 中文字幕| 欧美国产亚洲一区| 最新中文字幕在线播放| 一区二区三区四区五区视频在线观看| 日本a级黄色| 99精品一级欧美片免费播放| 亚洲a一级视频| www.精品av.com| 中文字幕精品亚洲| 国产一级片在线| 欧美日本精品| 日韩高清在线不卡| 中文字幕亚洲第一| 国产日韩免费| 日韩欧美中文免费| 亚洲视频电影在线| 刘玥91精选国产在线观看| 91欧美日韩在线| 日韩欧美在线综合| 日韩精品一级| 欧美日韩国产免费观看视频| 国产裸体歌舞团一区二区| 日韩av综合在线观看| 国产在线观看黄色| 国产在线看一区| 亚洲成在线观看| 亚洲欧美日本国产专区一区| 国产成人综合精品| 午夜黄色小视频| 亚洲va韩国va欧美va精品| 一区二区三区在线播放视频| 国产黄色精品| 久久综合久久综合九色| 欧美日韩国产在线| 中文字幕4区| 日韩在线高清| 国产在线日韩欧美| 日韩欧美中文字幕在线观看| 精品熟女一区二区三区| aaa欧美日韩| 精品一区二区三区中文字幕| 欧美啪啪一区| a视频在线播放| 亚洲免费精品| 国产成人精品亚洲| 亚洲.国产.中文慕字在线| 亚洲免费在线观看av| 久久视频一区| 91久久中文| 精品日韩一区二区三区免费视频| 久久久精品国产免费观看同学| 日韩精品中文字幕第1页| 国产成人精品亚洲| 久久综合九色欧美综合狠狠| 欧美日韩亚洲一区| 色国产在线视频| 欧美日韩性视频一区二区三区| www.三级.com| 免费高清视频日韩| 日韩久久99| 欧洲精品在线一区| 精品久久九九| 日韩精品大片| 精品精品久久| 一区二区三区免费看视频| 国产欧美综合在线| 国产欧美久久久精品影院| 国产综合成人久久大片91| 欧美亚洲天堂| 中文字幕欧美在线| 国产永久在线观看| 91最新在线| 国产欧美日韩精品综合| 精品视频三区| 精品极品三级久久久久| 91精品国产日韩91久久久久久| 日韩欧美久久久| 国产日韩精品在线| 一区二区三区鲁丝不卡| 欧美日韩高清一区二区不卡| 日韩中文首页| 欧美日韩不卡在线视频| 午夜视频在线观看一区| av免费在线不卡| 一级特黄大欧美久久久| 久久精品日韩无码| 欧美另类久久久品| 国产日韩精品在线| 欧美日韩国产综合视频在线观看中文| 亚洲高清视频一区| 日韩精品第一区| 亚洲一区日韩精品中文字幕| 久久久久久99精品| www.狠狠干| 日韩在线观看视频一区| 中文字幕在线观看精品| 中文字幕欧美日韩在线| xxxxx性| 日韩精品第一区| 91精品在线免费| 99这里有精品视频| 欧美不卡123| 中文精品视频| 日韩欧美综合| 日韩色在线观看| 日韩中文首页| 免费视频一区三区| 一区二区三区精品久久久| 日韩国产一区| 91精品视频国产| 日韩欧美中文免费| 国产aa精品| 日韩久久久精品| 中文字幕 亚洲视频| 国产日韩精品在线| 欧美亚洲天堂| 国产黄色在线看| 最近中文字幕在线中文视频| www.av中文字幕| 亚洲综合在线小说| 国产激情三区| 日韩亚洲欧美中文三级| 亚洲娇小xxxx欧美娇小| 日韩精品中文在线观看| 国产福利第一页| 日韩免费看网站| 精品日韩在线| 欧美一级日韩一级| 国产欧美日韩精品在线| 久久精品www| av一区在线| 一区二区三区免费看视频 | 国产欧美久久久| 在线视频观看日韩| 国产午夜精品视频| 欧美日韩视频在线| 日本不卡一区在线| 亚洲高清精品视频| 国产在线观看黄色| 日韩视频一区二区在线观看| 欧美精选午夜久久久乱码6080| 亚洲第一福利视频在线| 日韩中文字幕网| 亚洲丝袜一区| 国产91欧美| 国产羞羞视频在线播放| 亚洲福利一区二区三区| 97久久精品午夜一区二区| 激情国产在线| 日韩欧美国产高清91| 欧美日韩亚洲不卡| 欧美日韩中文字幕精品| 极品久久久久久| 欧美一级免费在线观看| 欧洲精品久久久| 中文字幕亚洲国产| av一区在线观看| 国产亚洲一区字幕| 亚洲大片精品永久免费| 国产久卡久卡久卡久卡视频精品| 国产一区久久久| 国产在线观看91| 午夜亚洲一区| 在线日韩精品视频| 亚洲欧洲综合另类| 欧美日韩免费视频| 久久久精品午夜少妇| 日韩午夜黄色| 日韩精品在线私人| 久久久另类综合| 国产福利在线播放| 中文字幕视频在线观看| 日本啊v在线| 91精品观看| 高清1区2区| 美日韩精品免费视频| 天堂在线www天堂中文在线| 日韩精品―中文字幕| 欧美日韩99| 欧美激情一区二区在线| 中文字幕99| 中文在线不卡视频| 亚洲成年人在线播放| av亚洲免费| 国产欧美日韩最新| 国产欧亚日韩视频| 亚洲伊人婷婷| 亚洲一区日韩精品中文字幕| 国产裸体歌舞团一区二区| 国产视频一区二| 91久久久精品国产| 91精品国产91综合久久蜜臀| 国产在线精品国自产拍免费| 国产v日产∨综合v精品视频| 久久久精品免费免费| 一区二区三区久久| 精品在线91| 一区二区三区中文字幕在线观看| 国产高清一级片| 久久99精品久久久久子伦 | 日韩国产专区| 在线欧美日韩精品| 欧美日韩国产亚洲一区| 亚洲欧美中文字幕在线一区| 欧美国产综合在线V| 日韩精品一二三四区| 日韩美女视频一区二区在线观看| 欧美日韩国产第一页| 亚洲区中文字幕| 精品在线一区二区| 国产欧美中文在线| 欧美日韩在线网站| 国产最新在线| 国产偷国产偷亚洲清高网站 | 999精品色在线播放| 91精品国产综合久久香蕉的特点 | www.91香蕉视频| 精品国产1区2区3区| 国产一卡二卡3卡4卡四卡在线| 欧美一级欧美三级在线观看| 欧美在线视频第一页| 日韩一二三四区| 男人的天堂网av| 国产综合成人久久大片91| 91精品国产91久久久久| 中文字幕亚洲第一| www.xxxx精品| 日韩中文欧美| 婷婷综合福利| 欧美日韩国产专区| 黄色片网站在线| 91精品在线观看视频| 欧美日韩中文字幕在线| www.xxxx精品| 中文字幕日韩第一页| 欧美久久在线观看| 国产黄色小视频| 欧美日韩综合视频网址| 91精品国产高清久久久久久|