2017-02-22 3 views
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 вернуть значение в имени атрибута, а не имя класса или метод. например: 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, но я думал, что я могу изменить имя класса или свойств ...

+5

Вы хотите взять функцию, которая была создана таким образом, что вы можете иметь сильные компиляционные гарантии совпадений имен, а не полагаться на хрупкое использование строк и ... повторно вводить хрупкое использование строк? –

+0

'nameof' был разработан специально для использования текущего имени класса, переменной и т. Д. Целью было то, что если имя было изменено, программистам не пришлось бы везде менять жесткий текст с буквами. – ps2goat

+1

Согласен, вопрос чувствует себя немного странно, возможно, если вы объясните, что вы в конечном итоге пытаетесь выполнить, может быть, есть более практичный способ его достижения. – Jake

ответ

3

Я боюсь, что вы не можете сделать это с nameof.

Но если вы хотите, чтобы получить значение 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; 
Смежные вопросы