在运行时访问 DisplayClass 对象的 属性

Accessing property on DisplayClass object at runtime

环境: VS2017,C# 7.0 针对 .NET Core 2.1。

我正在尝试编写 fake/mock class 用于单元测试,但我在访问 DisplayClass 对象上的 属性 时遇到困难,我的理解是 a closure class from an anonymous function.

我的代码如下所示:

namespace MyCompany.Application.Web.Test.Fakes
{
    public class FakeElasticClient : IElasticClient
    {
        public FakeElasticClient() { }

        public Task<ISearchResponse<T>> SearchAsync<T>(Func<SearchDescriptor<T>, ISearchRequest> selector = null, CancellationToken cancellationToken = default(CancellationToken)) where T : class
        {
            var methodName = selector.Method.Name;
            dynamic tgt = selector.Target;
            object id = tgt?.GetType().GetProperty("id")?.GetValue(tgt, null);
            int? total;
            if (methodName.Contains("Quux"))
            {
                total = CountSomething((Guid)id);
            }
            else
            {
                total = CountSomethingElse((Guid)id);
            }

            return Task.Run(() => new FakeSearchResponse<T>(total ?? 0) as ISearchResponse<T>);
        }

        // … below here follows a couple thousand other methods

id 转换为 Guid 会引发 NullReferenceException,即使 Visual Studio 调试器显示 tgt 对象具有 id 属性:

评论:

如何检索 id 的值?

编译器生成带有字段而不是属性的闭包类型,因此 id 是一个字段。请改用 tgt.GetType().GetFields()