gpt4 book ai didi

c# - 使用自定义属性对 FieldList 进行排序

转载 作者:行者123 更新时间:2023-11-30 17:27:45 26 4
gpt4 key购买 nike

我想以特定顺序检索对象中的字段。我找到了一种使用反射来检索字段的方法,但不能保证每次都以相同的顺序返回字段。这是我用来检索字段的代码:

ReleaseNote rn = new ReleaseNote();
Type type = rn.GetType();
FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

我找到了 this answer to another question ,其中解释了如何添加自定义属性并使用它对字段进行排序。基于此,我认为我需要更新我的代码以通过创建自定义属性“MyOrderAttribute”来按排序顺序检索字段,我将使用该属性对 FieldInfo 数组进行排序。

我在这里创建了属性并将其添加到我的字段中:

namespace TestReleaseNotes
{
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class MyOrderAttribute : Attribute
{
public MyOrderAttribute(int position)
{
this.Position = position;
}

public int Position { get; private set; }
}

class ReleaseNote
{
[MyOrder(0)]
private string title;
[MyOrder(1)]
private string status;
[MyOrder(3)]
private string implementer;
[MyOrder(3)]
private string dateImplemented;
[MyOrder(4)]
private string description;

这里我尝试使用属性对字段列表进行排序:

ReleaseNote rn = new ReleaseNote();
Type type = rn.GetType();
FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).OrderBy(f => f.Position);

这给了我错误“‘FieldInfo 不包含‘Position’的定义,并且找不到接受‘FieldInfo’类型的第一个参数的可访问扩展方法‘Position’(您是否缺少 using 指令或程序集引用?)”

我还尝试了 GetCustomAttribute 方法,它会产生错误“'MyOrderAttribute' 是一种类型,在给定的上下文中无效”:

FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).OrderBy(f => f.GetCustomAttribute(MyOrderAttribute);

访问 MyOrderAttribute 并使用它对我的字段进行排序的正确语法是什么?

最佳答案

使用以下表达式:

FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).OrderBy(f => (int?)(f.CustomAttributes.Where(a=>a.AttributeType==typeof(MyOrderAttribute)).FirstOrDefault()?.ConstructorArguments[0].Value) ?? -1).ToArray();

?.和 ??运算符在这里处理没有排序属性的字段。它默认为 -1 中的非有序字段(即在有序列表的开头)。将其替换为 int.MaxValue,或 9999 以将未排序的字段放在末尾。

关于c# - 使用自定义属性对 FieldList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54448294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com