解決C 中dynamic型別作為泛型引數的反射問題

2022-01-23 03:23:40 字數 1666 閱讀 3426

c#中dynamic型別作為泛型引數傳遞過去後,反射出來的物件型別是object,我用老外的這篇博文中的**跑起來,得出的結果是:flying using a object map (a map),將fly(t map)方法的**改為如下**,即可獲取dynamic物件的原始型別:

type t = typeof

(t);

if (t == typeof(object

))console.writeline(

"flying using a map ()

", t.name, map);

實際專案中用到了mvccontrib,在呼叫orderby時傳入的是iqueryable物件,反射此類物件的屬性時,會報異常,mvccontrib.sorting中**是這樣的:

public

static iqueryableorderby(this iqueryabledatasource, string

propertyname, sortdirection direction)

var type = typeof

(t);

var property =type.getproperty(propertyname); //這裡報異常

if(property == null

) ' on type

", propertyname, type));

}var parameter = expression.parameter(type, "p"

);

var propertyaccess =expression.makememberaccess(parameter, property);

var orderbyexp =expression.lambda(propertyaccess, parameter);

const

string orderby = "

orderby";

const

string orderbydesc = "

orderbydescending";

string methodtoinvoke = direction == sortdirection.ascending ?orderby : orderbydesc;

var orderbycall = expression.call(typeof

(queryable),

methodtoinvoke,

new ,

datasource.expression,

expression.quote(orderbyexp));

return datasource.provider.createquery(orderbycall);

}

原因是呼叫此方法時,如果傳入的泛型是dynamic,typeof(t)得出的結果是object,接下來的property將會出異常。

解決的辦法是:在 var type = typeof(t); 後面加一段判斷語句,**如下:

var type = typeof

(t);

if(type == typeof(object

))

這樣就可以獲取iqueryable的原始型別。

C 資料型別(dynamic)

自己在寫重構的時候用到了dynamic這個函式,然後就去網上找個找關於這個函式的有關內容,首先是對這個函式認識。關於這個函式乙個籠統的認識就是這個函式和var一樣是個萬能函式,什麼樣的資料型別符合,如果我們在用到用於接受一些資料的時候,但是這個傳過來的資料型別我們不知道是什麼型別的,那我們就可以用d...

SwiftUI中的動態型別Dynamic Type

今天我想和您談談swiftui中對動態型別的支援。我認為,如果您的應用中沒有動態型別支援,就無法創造出色的使用者體驗。swiftui為任何文字表示形式提供了開箱即用的動態型別,並簡化了我們的工作。但是我們仍然需要做一些工作,所以讓我們談談它。動態型別功能允許使用者選擇螢幕上顯示的文字內容的大小。它可...

C 使用dynamic型別訪問JObject物件

dynamic是c 裡面的動態型別,可在未知型別的情況訪問對應的屬性,非常靈活和方便。使用json.net可以把乙個json字串轉換成乙個jobject物件,如果有已知強型別,如果有已知對應的強型別,可以直接轉成對應的型別。但如果沒有,要訪問json裡面對應的資料的時候,就顯得比較麻煩。我們可以借助...