根据语言的不同,我有不同的反射结果:C# vs F#
C#
public abstract class TestHandler : HttpMessageHandler
{
public abstract Task<HttpResponseMessage> MockableSendAsync(HttpRequestMessage request, CancellationToken cancellationToken);
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
var methods = typeof(TestHandler).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
methods包含SendAsync、Dispose、MemberwiseClone和Finalize。
现在F#
open System.Net.Http
open System.Threading
open System.Threading.Tasks
open System.Reflection
[<AbstractClass>]
type TestHandler() =
inherit HttpMessageHandler()
abstract member MockableSendAsync: HttpRequestMessage * CancellationToken -> Task<HttpResponseMessage>
override this.SendAsync(request, cancellationToken) = this.MockableSendAsync(request, cancellationToken)
let methods = typeof<TestHandler>.GetMethods(BindingFlags.NonPublic ||| BindingFlags.Instance)
methods只包含三个方法,SendAsync不存在。
但是,如果我使用Public绑定标志,则methods包含更多条目,包括SendAsync:
let methods = typeof<TestHandler>.GetMethods(BindingFlags.NonPublic ||| BindingFlags.Instance ||| BindingFlags.Public)
RuntimeMethodInfo但是, C# 和 F# 版本存在差异。
对于 C#Attributes属性是:
- PrivateScope、Family、Virtual、HideBySig、
而对于 F#,它是:
- PrivateScope、Public、Virtual、HideBySig
怎么回事?!承诺尊重protected可见性修饰符在哪里?