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

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

我正在尝试编写一个用于单元测试的假/模拟类,并且我在访问DisplayClass对象上的属性时遇到了困难,我知道这是来自匿名函数的闭包类

我的代码如下所示:

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

即使 Visual Studio 调试器显示该对象具有一个属性,强制转换id为也会Guid抛出一个:NullReferenceExceptiontgtid

http://img.mukewang.com/6354a49900013a1b06180044.jpg

注释:

  • 我从这个答案object id = …中偷了线。

  • tgt.GetType()返回MyCompany.Application.Domain.Repository.Implementations.BusinessEntityRepository.<>c__DisplayClass8_0

  • tgt.GetType().GetProperties()返回一个空PropertyInfo数组。

  • 这篇博文的启发,我为 the和class添加了一个[assembly: InternalsVisibleTo("MyCompany.Application.Web.Test")]属性,据我所知,这是调用链中唯一涉及的两个类。没有任何区别。MyCompany.Application.Domain.Repository.Implementations.BusinessEntityRepositoryMyCompany.Application.Web.Controllers

  • 我尝试IgnoresAccessChecksTo 按照此处描述的方法进行操作,但无法编译任何内容。

如何检索 的值id


慕虎7371278
浏览 70回答 1
1回答

德玛西亚99

编译器使用字段而不是属性生成闭包类型,字段id也是如此。改为使用tgt.GetType().GetFields()。
打开App,查看更多内容
随时随地看视频慕课网APP