после прочтения всех вопросов, предложенных как связанные, я не смог найти ответ на свой вопрос.Пишу вам в надежде, что вы скоро ответите и снисходительно осудите мое отсутствие знаний в этой области.
У меня есть тип для включения определения функции:
type FunctionDefinition<'a>(exec:int->(Data.Reader->'a)) =
member x.Exec = exec
member x.ReturnType = typeof<'a>
Как выЗдесь можно увидеть, что exec
должна быть функцией, которая принимает один аргумент int
и возвращает другую функцию, которая принимает один аргумент Data.Reader
и возвращает значение типа 'a
(такая утомительная фраза!).Определение Data.Reader
здесь неуместно.
Кроме того, у меня есть словарь для хранения string->FunctionDefinition
пар следующим образом:
let FUNCTIONS = new Generic.Dictionary<string, FunctionDefinition<obj>>()
FunctionDefinition
экземпляры в FUNCTIONS
собираютсячтобы держать функции нескольких типов, и именно поэтому это FunctionDefinition<obj>
(я считаю, что это корень зла, но я не могу избежать этого, поэтому я здесь).
Тогда у меня есть некоторые функции длябыть завернутым в FunctionDefinition
и помещенным в FUNCTIONS
:
/// Function definitions
let unchanged (id:int) =
let mutable last = null
fun (reader:Data.Reader) ->
if last = null then
false
else
let cur = reader.GetValue(id)
let ret = last.Equals(cur)
last <- cur
ret
let changed (id:int) =
let un = unchanged id
fun(reader:Data.Reader) ->
not (un reader)
let dummyfortesting (id:int) =
fun(x) -> "yam-yam"
Я думал, что смогу добавить эти функции в свой словарь, но ... Ничего подобного!Следующий код:
FUNCTIONS.Add("unchanged", new FunctionDefinition<bool>(unchanged))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTIONS.Add("changed", new FunctionDefinition<bool>(changed))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FUNCTIONS.Add("dummy", new FunctionDefinition<string>(dummyfortesting))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
дает недвусмысленные сообщения об ошибках:
// The type 'obj' does not match the type 'bool'
// The type 'obj' does not match the type 'bool'
// The type 'obj' does not match the type 'string'
, тогда как верно следующее:
typeof<bool>.isSubclassOf(typeof<obj>) // -> true
Это несправедливо, не так ли?
Вопрос:
Как создать FUNCTIONS
словарь для хранения нескольких FunctionDefinition<bool>
, FunctionDefinition<string>
экземпляров?
или есть другое решение?чем хранить общий тип FunctionDefinition
для функций, которые возвращают разные типы?
Одно из решений - передать требуемый тип в качестве аргумента конструктору FunctionDefinition
следующим образом:
type FunctionDefinition(typ:System.Type, exec:int->(Data.Reader->???)) =
member x.Exec = exec
member x.ReturnType = typ
Но здесь неясно, как объявить exec
.
Надеюсь, я был достаточно ясен.
Большое спасибо.
С уважением,
Х