如何避免在我的MVC的自定义模型绑定使用魔术字符串?

问题描述 投票:1回答:1

我有确定具体类型实例化用于基于属性的值的抽象类型的方法:

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"的名字吗?如果有人重命名的财产,我不希望我的modelbinding打破。

我沿线的一些思考

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

......但没有这样的小动物存在。

c# model-view-controller reflection model-binding
1个回答
2
投票

您可以使用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

© www.soinside.com 2019 - 2024. All rights reserved.