为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕虎7371278 2022-10-23 10:18:41
环境: 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注释:我从这个答案object id = …中偷了线。tgt.GetType()返回MyCompany.Application.Domain.Repository.Implementations.BusinessEntityRepository.<>c__DisplayClass8_0tgt.GetType().GetProperties()返回一个空PropertyInfo数组。受这篇博文的启发,我为 the和class添加了一个[assembly: InternalsVisibleTo("MyCompany.Application.Web.Test")]属性,据我所知,这是调用链中唯一涉及的两个类。没有任何区别。MyCompany.Application.Domain.Repository.Implementations.BusinessEntityRepositoryMyCompany.Application.Web.Controllers我尝试IgnoresAccessChecksTo 按照此处描述的方法进行操作,但无法编译任何内容。如何检索 的值id?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

编译器使用字段而不是属性生成闭包类型,字段id也是如此。改为使用tgt.GetType().GetFields()



查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信