Я не могу не задаться вопросом, как вы попали в это состояние в первую очередь.
Тем не менее, предполагая, что статическим типом является 'объект', тогда я предполагаю, что вам придется посмотреть, является ли его .GetType () определением универсального типа для FSharpOption`1, и использовать отражение (или «динамический») для разверните один уровень и попробуйте снова ...
Мне неясно, как это вопрос F #, поскольку вы хотите получить ответ в C # или VB, и тот же вопрос можно задать для любого типа Foo .
Это все сказано, вот код C # 4.0:
object o = FS.Foo.F(3);
while (o.GetType().IsGenericType &&
o.GetType().GetGenericTypeDefinition() ==
typeof(Microsoft.FSharp.Core.FSharpOption<>))
{
dynamic d = o;
o = d.Value;
}
Console.WriteLine(o);
и немного кода F #:
namespace FS
type Foo() =
static member F x =
match x with
| 1 -> Some 42 |> box
| 2 -> Some(Some "forty-two") |> box
| 3 -> Some(Some(Some 42)) |> box
| _ -> failwith "no"
РЕДАКТИРОВАТЬ, заметьте, что я изменил его, чтобы показать, что стратегия работает, даже если она содержит вещи, отличные от целых.