获取属性的 JsonPropertyAttribute

2023-11-27

我发现一篇文章对我遇到的问题提供了很好的答案,但我似乎找不到我正在寻找的小细节。

public class myModel
{
   [JsonProperty(PropertyName = "id")]
   public long ID { get; set; }
   [JsonProperty(PropertyName = "some_string")]
   public string SomeString {get; set;} 
}

我需要一个返回的方法JsonProperty PropertyName的特定属性。也许我可以通过的东西TypeProperty我需要,并且该方法返回值(如果找到)。

这是我发现的方法,它让我朝着正确的方向前进(我相信)取自这里

using System.Linq;
using System.Reflection;
using Newtonsoft.Json;
...

public static string GetFields(Type modelType)
{
    return string.Join(",",
        modelType.GetProperties()
                 .Select(p => p.GetCustomAttribute<JsonPropertyAttribute>()
                 .Where(jp => jp != null)
                 .Select(jp => jp.PropertyName));
}

目标是调用这样的函数(任何修改都可以)

string field = GetField(myModel, myModel.ID);

更新#1

我将上面修改为这个,但我不知道如何获取字符串ID from myModel.ID.

public static string GetFields(Type modelType, string field) {
    return string.Join(",",
        modelType.GetProperties()
            .Where(p => p.Name == field)
            .Select(p => p.GetCustomAttribute<JsonPropertyAttribute>())
            .Where(jp => jp != null)
            .Select(jp => jp.PropertyName)
        );
}

我想要prevent实际属性名称的硬编码字符串。例如我do not想要将上面的方法调用为:

string field = GetField(myModel, "ID");

我宁愿使用类似的东西

string field = GetField(myModel, myModel.ID.PropertyName);

但我不完全确定如何正确地做到这一点。

Thanks!


这是一种在保持强类型的同时做到这一点的方法:

public static string GetPropertyAttribute<TType>(Expression<Func<TType, object>> property)
{
    var memberExpression = property.Body as MemberExpression;
    if(memberExpression == null)
        throw new ArgumentException("Expression must be a property");

    return memberExpression.Member
        .GetCustomAttribute<JsonPropertyAttribute>()
        .PropertyName;
}

并这样称呼它:

var result = GetPropertyAttribute<myModel>(t => t.SomeString);

您可以使其更通用一些,例如:

public static TAttribute GetPropertyAttribute<TType, TAttribute>(Expression<Func<TType, object>> property)
where TAttribute : Attribute
{
    var memberExpression = property.Body as MemberExpression;
    if(memberExpression == null)
        throw new ArgumentException("Expression must be a property");

    return memberExpression.Member
        .GetCustomAttribute<TAttribute>();
}

现在因为该属性是通用的,所以您需要移动PropertyName拨打外线:

var attribute = GetPropertyAttribute<myModel, JsonPropertyAttribute>(t => t.SomeString);
var result = attribute.PropertyName;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取属性的 JsonPropertyAttribute 的相关文章

  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 为什么在使用 Model.copy() 后出现“GurobiError:变量不在模型中”?

    我需要优化具有不同约束集的模型 但这些约束的子集对于每个模型都是相同的 我的想法是构建一个包含每次都需要的所有变量和所有约束的基本模型 但是 它看起来并不像 Gurobi Model copy 方法按照我想象的方式复制变量 这是我希望做的事
  • 安装旧版本的 R 包

    我正在尝试使用 Rpy2 和 ggplot2 但出现错误 经过网上一些搜索错误 我发现发生错误是因为ggplot2包中存在尚未反映在Rpy2中的更改 例如 参见这个帖子 编辑 链接现已失效 所以我现在需要安装旧版本的 ggplot2 这是我
  • .NET Core 相当于 Thread.Abort

    背景 我有一个Service抽象 每个服务都有自己的WorkItem 工作项能够从一些数据开始 该服务正在限制执行时间WorkItem 假设单个工作项最多可能需要 60 秒 在此之后 Service应该杀掉它 这段代码从 NET Frame
  • Android TimePickerDialog材质设计颜色

    我在我的应用程序中使用时间选择器对话框 我还使用 appcompat 来为我的应用程序提供材料设计主题 然而 该对话框保留默认的青色强调色 我的强调色是浅蓝色 所以在我的代码中我尝试将对话框主题设置为我自己的并且它可以工作接受它使其全屏显示
  • 获取 java.util.List 的泛型类型

    I have List
  • 如何使用 Node.js“执行”HTML+Javascript 页面

    这样 我就有了 Node js 脚本 我有一些 HTML 页面 其中包含带有 JavaScript jquery 的 HTML 如何加载它并获取该页面上 JavaScript 的执行结果 你可以检查zombie js项目 http zomb
  • (React) CSSTransition 与 css 模块

    我正在尝试在我的项目中实现 CSSTransition 到模式 问题是我正在使用 css 模块 我的模态的渲染方法 render return
  • 检测 html 表单是否被编辑的通用方法

    我有一个选项卡式 html 表单 从一个选项卡导航到另一选项卡时 即使数据没有更改 当前选项卡的数据也会保留 在数据库上 我想仅在编辑表单时才进行持久性调用 该表单可以包含任何类型的控件 不一定要通过键入一些文本来弄脏表单 但在日历控件中选
  • 如果为空则创建新实例的简写?

    在 Javascript 中我可以这样做 var myVar returnNull new MyObject 在 C 中 我目前正在这样做 var myVar returnObjectOrNull if myVar null myVar n
  • 在 mongodb 中存储赞成票/反对票

    我有一个收藏Posts and Users用户可以对每个帖子投赞成票 反对票 将其存储在 mongodb 数据库中以确保用户不能多次为给定文档投票的最佳方法是什么 我想出的最简单的 nosql ish 解决方案是存储在每个内部投票的 use
  • 跨平台网络 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道是否有一个 API 可以在 Windows Mac 和 Linux 上运行网络 我想做一个2人可以通过TCP连接玩的纸牌游戏 有几个选项可以
  • 使用ngrx一次获取store的当前状态

    您好 我想知道是否有人知道如何在无需订阅的情况下获取商店的当前状态 我目前正在使用 ngrx 订阅商店并访问其状态以设置组件的属性 但由于我订阅了该属性 所以它会不断刷新 因此 我正在寻找一种仅获取此属性一次的方法 以便我可以显示数据而无需
  • Android 滑动布局来关闭

    我正在尝试制作一个可滑动的布局 这样你就可以像现在在谷歌中一样滑动它来关闭 我设法使用以下代码让它在诸如按钮之类的视图上工作 SwipeDismissTouchListener public class SwipeDismissTouchL
  • 为什么 C# 似乎部分未转义命令行参数?

    我试图将多个路径作为参数传递给控制台应用程序 但收到 路径中的非法字符 错误 参数的最后两个字符似乎出现了错误 C test 对于转义的双引号 例如 如果我用 C 创建一个新的空控制台应用程序 如下所示 static void Main s
  • 命令光标的对象不可下标

    我是 Python 和 MongoDB 的新手 我正在使用 Flask python 和 MongoDB 开始一个新项目 当我尝试使用返回数据时aggregate 函数 它给我以下错误 命令光标的对象不可下标 这是我的查询代码 Data d
  • 使用 contenteditable div 而不是 textarea 的自动完成似乎不起作用

    我正在使用 Andrew Whitaker 的自动完成插件 这个问题也提到了 jquery 自动完成 mention 如果我使用 contenteditable div 而不是文本区域 这将不起作用 这是我的代码 div div MyTex
  • Python 中的曲面曲率 Matlab 等效项

    我试图计算由点数组 x y z 给出的曲面的曲率 最初我试图拟合多项式方程 z a bx cx 2 dy exy fy 2 然后计算高斯曲率 K frac F xx cdot F yy F xy 2 1 F x 2 F y 2 2 然而 如
  • 如何检查两个模板参数是否完全相同?

    如何修改以下函数模板 使其返回 42 if 模板参数T and U是完全相同的类型吗 template
  • 运行用 C 编写的程序时“未找到”Cygwin1.dll。如何让 Windows 找到它?

    所以我试图运行我的第一个用 C 编写的 hello world 程序 IS 在 eclipse 中编译它并且没有错误 但是当我尝试运行它时我得到 此应用程序无法启动 因为找不到 cygwin1 dll I found 这个帖子这似乎表明我应
  • 获取属性的 JsonPropertyAttribute

    我发现一篇文章对我遇到的问题提供了很好的答案 但我似乎找不到我正在寻找的小细节 public class myModel JsonProperty PropertyName id public long ID get set JsonPro