該說明下的InvokeMember page「備註」表示InvokeMember不能被用來調用的通用方法。大概這與你不能使用typeof<Foo>.GetMethod("Id").Invoke(...)
的事實有關,因爲你需要以某種方式指定一個通用參數。
在另一方面,它看起來像你也許可以破解的東西一起有在工作一拍:
type MyBinder() =
inherit System.Reflection.Binder() with
let bnd = System.Type.DefaultBinder
override x.SelectProperty(a,b,c,d,e) = bnd.SelectProperty(a,b,c,d,e)
override x.ChangeType(a,b,c) = bnd.ChangeType(a,b,c)
override x.BindToField(a,b,c,d) = bnd.BindToField(a,b,c,d)
override x.ReorderArgumentArray(a,b) = bnd.ReorderArgumentArray(&a,b)
override x.SelectMethod(a,b,c,d) = bnd.SelectMethod(a,b,c,d)
override x.BindToMethod(a,meths,args,b,c,d,e) =
try
bnd.BindToMethod(a,meths,&args,b,c,d,&e)
with _ ->
let [| meth |],[| arg |] = meths,args
upcast (meth :?> System.Reflection.MethodInfo).MakeGenericMethod([| arg.GetType() |])
該處理與一個參數唯一的非重載泛型方法,但你可以嘗試使其更強大。但是,如果這個BindToMethod的實現打破了所有預期的不變量,我不會感到驚訝,因爲它返回了一個沒有作爲候選者傳入的方法。
可以請你刪除C#標籤 – 2009-09-04 16:52:15
肯定。你能解釋爲什麼嗎?我是新來的Stackoverflow,並不知道所有的規則,但我認爲這個問題並不是真正的語言特定 - 所以如果F#標籤有,爲什麼不C#呢? – t0yv0 2009-09-04 20:34:48