Как я могу избежать использования магических строк в моем MVC CustomModelBinding? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть метод, который определяет конкретный тип для создания экземпляра для абстрактного типа на основе значения свойства:

private static Type GetModelType(ControllerContext controllerContext, 
    ModelBindingContext bindingContext, Type modelType)
{
    if (modelType != typeof(MyAbstractClass)) return modelType;

    var key = "MyAbstractClass.ConcreteTypeEnum";
    if (bindingContext.ValueProvider.ContainsPrefix(key))
    {
        var concreteTypeName = bindingContext.ValueProvider.GetValue(key).AttemptedValue;
        modelType = Type.GetType(
          $"{modelType.Namespace}.{concreteTypeName}, {modelType.Assembly}" );
        }
    }
    return modelType;
}

Как я могу (возможно, с помощью отражения) определить имя свойства"MyAbstractClass.ConcreteTypeEnum" без использования строки, чтобы найти ее?Если кто-то переименовывает свойство, я не хочу, чтобы привязка моей модели нарушалась.

Я думаю о чем-то вроде

var key = modelType.GetProperty(t => t.ConcreteTypeEnum).Name 

... но такого существа не существует.

1 Ответ

0 голосов
/ 04 февраля 2019

Вы можете использовать nameof, чтобы получить свойство и имя класса в виде строки.Таким образом, если вы получаете безопасность времени компиляции, например, при переименовании класса или свойства.Используйте это так:

var propertyName = nameof(MyAbstractClass.ConcreteTypeEnum); 
// propertyName is now "ConcreteTypeEnum"
var className = nameof(MyAbstractClass);
// className is now "MyAbstractClass"

Детали: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof

...