1

例如:

public class Car{

     public string color {get; set;}

     public int VINCode {get;set;}

}

现在,如果我调用nameof(Car)它返回“汽车”

[Name("something")]
public class Car{

     [Name("something_else")]
     public string color {get; set;}

     public int VINCode {get;set;}

}

但是如何让 nameof 返回 Name 属性中的值而不是类或方法的名称。例如:nameof(Car) == "something"nameof(Car.color) == "something_else"

问题:

var modelState = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(data);

        var departmentViewModels = modelState[nameof(DepartmentListView.DepartmentsViewModels)][0];
        var departmentTypes = modelState[nameof(DepartmentListView.DepartmentsViewModels)][0];

为此修复:

var modelState = JsonConvert.DeserializeObject<DepartmentListView>(data);

        var departmentViewModels = modelState.DepartmentsViewModels;
        var departmentTypes = modelState.DepartmentTypes;

这个序列化:

public class DepartmentListView
    {
        public IEnumerable<DepartmentViewModel> DepartmentsViewModels { get; set; }

        public IEnumerable<DepartmentType> DepartmentTypes { get; set; }
    }

将会:

departmentsViewModel : [], departmentTypes : [] (with lowercase)

我知道我可以使用JsonProperty更改小写序列化,但我认为我可以更改类或属性的名称......

4

2 回答 2

3

恐怕你不能用nameof.

但是如果你想得到 a 的值,CustomAttribute你可以试试这个:

// I assume this is your Name class
public class Name: Attribute
{
    public string Data { get; }
    public Name(string data) { Data = data; }
}

那么你也能

// Will return "something"
var classAttrData = ((Name) typeof(Car).GetCustomAttribute(typeof(Name))).Data;

// Will return "something_else"
var fieldAttrData = ((Name) typeof(Car).GetField(nameof(Car.color)).GetCustomAttribute(typeof(Name))).Data;
于 2017-02-22T15:47:03.357 回答
1

看起来您是在询问您尝试的解决方案,而不是您的实际问题。

获取类/属性的新名称的解决方案:

使用DisplayNameAttribute创建您的类,如下所示:

[DisplayName("something")]
public class Car
{
    [DisplayName("something_else")]
    public string color { get; set; }

    public int VINCode { get; set; }
}

要获取您的类属性名称:

var attributes = typeof(Car) // type declaration
        
        .CustomAttributes.FirstOrDefault() // first item of collection that contains this member's custom attributes like [DisplayName("something")]
        
        ?.ConstructorArguments.FirstOrDefault() // first item of structure collecion
        
        .Value; // value as string - "something"

与属性名类似,只需要先获取其类型即可

var attribute = typeof(Car).GetProperty(nameof(Car.color)) // ...

代替

var attribute = typeof(Car) // ...
于 2021-02-24T14:02:40.530 回答